Προς το περιεχόμενο

JAVA midlets kai mathimatika? tetragoniki riza klp


JPG

Προτεινόμενες αναρτήσεις

Δημοσ.

Molis simera paratirisa oti sto MATH, tou API gia ta midlets den iparxoun methodoi gia ipologismo rizas, ipsosi se dinami klp.

 

Exei ipopsin tou kanenas kapoia "bibliothiki"...etoimo kodika telos panton? Ftiaxno ena midlet to opoio xriazete tetoia pragmata.

 

An oxi. Kserete kanena site, i pou allou telos panton tha bro mathimatikous algorithmous gia evresi rizas, logarithmous kai tetoia?

Δημοσ.

Ελα δεν ειμαι ο ειδικος στο θεμα..αλλα πραγματικα οταν ειδα οτι το CLDC με java.lang.Math να υποστηριζει μονο basic arithmetic επαθα πλακα! Και μου κινησε το ενδιαφερον. Βασικα η πρωτη εναλλακτικη που σκεφτηκα..χωρις να ξερω αν εινα σωστη εινα να χρησιμοποιησεις το java.math πακετο. με την ΒιgInteger που παρεχει βεβαια τετοια function αλλα για αρκετα μεγαλους αριθμους. Μετα απο 5 λεπτα ψαξιμο βεβαια στο fora της μαμας Sun βρηκα το εξης ενδιαφερον..

 

1. I don't know how well it would work, but you could look at the BigInteger and BigDecimal classes in the J2SE JDK, and see if you can port it to J2ME.They don't use any native methods, but it might be on the big side. They are quite general purpose though, so you may find that you can remove quite a bit of the code and still make them useful.

 

Αυτο που σκεφτηκα και εγω..αλλα παλι δεν εινα η καλυτερη λυση

 

 

2. http://www.spruce.jp/float/ χεχε καποιοι το εχουν κανει για σενα πριν απο σενα οπως λενε!

 

3.και το αλλο ενδιαφερον ειανι το παρακατω

simply grab the Float and Double classes from the j2se distribution. place them in your class path (make another jar file with j2me "extensions") .

 

 

Καλη τυχη μας λες ποιο απ'ολα επαιξε...και μην ξεχνας ποτε τα fora της Sun...

 

Δημοσ.

GrMikeD:

Ένα Java πρόγραμμα που τρέχει σε κινητά.

 

JPG:

στην πραγματικότητα είναι πολύ απλό να γράψεις ένα αλγόριθμο για υπολογισμό ύψωσγης σε δύναμη χρησιμοποιώντας αναδρομή. Το παρακάτω υπολογίζει έναν αριθμό υψωμένο σε μία δύναμη

 

>
public int power(int number, int pow)
{
    if (pow == 0)
        return 1;
    else
        return number * power(number, pow-1);
}

 

Για τη ρίζα, λογάριθμο κλπ είναι λίγο πιο πολύπλοκο αλλά αν ξέρεις πως βγαίνει δε θα έχεις πρόβλημα.

Δημοσ.

Υπάρχει ένας τρόπος να υπολογίζεις τετραγωνική ρίζα, λογάριθμο, και εκθετικές δυνάμεις με πολύ μεγάλη ακρίβεια και με φτηνές πράξεις (πολλαπλασιασμούς, προσθέσεις). Αν θέλεις μπορώ να στα γράψω εδώ.

Δημοσ.

Λογαριθμος:lnx

 

Σειρά Taylor: ln(1-x) = -1 - (x^2)/2 - (x^3)/3 - ........ - (x^n)/n για 1-<x<1

 

Η παραπάνω προσεγγιστική σειρά συγκλίνει με σχετικά καλή ακρίβεια για τιμές του n μεγαλύτερες του 9, και με ακρίβεια αποκοπής για 64 bit για τιμές μεγαλύτερες του 15.

 

Οπότε, για να υπολογίσεις τον λογάριθμο, κάνεις ένα scale στην περιοχή -1<x<1 υπολογίζεις το 1-x κτλ, κτλ

 

Εκθετική:e^x

 

Σειρά Taylor: e^x = 1 + x + (x^2)/2! + (x^3)/3! + ........ + (x^n)/n!

 

Τα ίδια περίπου ισχύουν και εδώ για την ακρίβεια της σύγκλισης της σειράς.

 

Στην πραγματικότητα η pow χρησιμοποιεί αυτές τις πράξεις για να υπολογίσει την δύναμη ώς εξής:

 

a = x^y

b = ylnx

a = e^b

 

Με τον συνδυασμό αυτών υπολογίζεις και την ρίζα.(x^0.5)

 

Υ.Γ Οχι και με bits βρε Γηρυο....., δεν τρελάθηκα ακόμα. <img src="http://www.insomnia.gr/ubbthreads/images/graemlins/smile.gif" alt="" />

 

 

Δημοσ.

Χεχεχε εν τάξει υπέθεσα ότι θα έχεις βρει λύσεις πολύ low-level :-).

 

Ερώτηση τώρα (δε θυμάμαι και πολλά από μαθηματικά). Η τιμή του n πού βασίζεται;

 

Δεύτερον για να υπολογίσουμε τη ρίζα θα πρέπει πρώτα να βρούμε λογάριθμο και εκθετική; Σύμφωνα με τα παραπάνω πώς βρίσκουμε τη ρίζα του 5; Αν σου είναι εύκολο γράψε έναν τύπο.

Δημοσ.

Η τιμή του n δεν βασίζεται κάπου συγκεκριμένα. Προφανώς τείνει στο άπειρο, αφού μιλάμε για απειροστικές σειρές.

 

Προγραμματιστικά υπολογίζεις μια τιμή του n για την οποία η ακρίβεια σου ειναι ανεκτή, και την κρατάς σταθερή.

 

Για να βρείς την ρίζα του 5 π.χ θα έκανες τα εξής:

 

n=9 (π.χ)

 

α = 5 ^ 0.5

b = 0.5 * ln 5 = 0,5 * 1,609437 = 0,8047189

α = e^b = 2,236066

 

Εγώ , υλοποιώντας τις παραπάνω μεθόδους για να βρίσκω δυνάμεις ρητων με ρητούς εκθέτες είχα μια ακρίβεια της τάξης του 3.10^-6.

 

Αν χρησιμοποιήσεις, μεγαλύτερη ακρίβεια (n=15 και πάνω) , τότε η ακρίβεια ειναι πάρα πολύ μεγάλη.

 

Σε ένα SUPER DUPER επεξεργαστή σαν αυτούς που αγοράζεις με 50 , μπορείς να βάλεις n=1000 και να βγάλεις σφάλμα αποκοπής ακόμα και για floating point 64 bits.

 

Εγώ έπρεπε να το κάνω σε FIXED POINT 16 bits επεξεργαστή, με 100 ΜΗz συχνότητα λειτουργίας...

Γι'αυτο και οι 9 επαναλήψεις μόνο

 

EDIT: n=1000 μάλλον όχι γιατί 1000! = 4 * 10 ^2567. Αν και έχω την εντύπωση οτι στους 64αρηδες απεικονίζεται το παραπάνω. Τουλάχιστον εσωτερικά.

Δημοσ.

η λυση οσο αναφορα την αποκοπη στα 64 bits τουλαχιστον στην java ερχεται μεσω BigNumbers , βεβαια εκει πλεον για να αvαkατασήσουν τους αριθμους χρησιμοποιουν αλλες βασεις (domain) .Δεν ειναι οτι πιο γρηγορο παρολα αυτα μπορεις να παιξεις ανετα με τοσο μεγαλους αριθμους ακομα και οταν μιλαμε περι ακριβειας σε floating point numbers.

 

Παρολα αυτα για να επανελθω στο αρχικο προβλημα του φιλου μας. οι παραπανω αλγοριθμοι θελουν ln , παραγωγικα κτλ κτλ. τα οποια στο συγκεκριμενο Library που χρησιμοποιει δεν υποστηριζοντε καν! οποτε η τελειως hand made Λυση ειναι μαλλον κατα την γνωμη μου παρακινδυνευμενη , βεβαια ενταξει παρουσιαζει ακαδημαικο ενδιαφερον!

Δημοσ.
apoc

said:

Παρολα αυτα για να επανελθω στο αρχικο προβλημα του φιλου μας. οι παραπανω αλγοριθμοι θελουν ln , παραγωγικα κτλ κτλ. τα οποια στο συγκεκριμενο Library που χρησιμοποιει δεν υποστηριζοντε καν! οποτε η τελειως hand made Λυση ειναι μαλλον κατα την γνωμη μου παρακινδυνευμενη , βεβαια ενταξει παρουσιαζει ακαδημαικο ενδιαφερον!

 

Ποια εννοείς handmade λύση;;;;;

Δημοσ.

Οι σειρές αυτές είναι πολύ καλές, συγγλίνουν γρήγορα..

υπάρχουν και αντίστοιχες για ημίτονο και συνημίτονο, αν θέλετε τις γράφω.

Δημοσ.

Δηλαδή τα library functions της Java έχουν μαγικά ξόρκια;;;;;

Δεν ειναι καθόλου HandMade, σε προκαλώ να κάνουμε ένα test, να δούμε αν θα πετύχεις καλύτερη ακρίβεια και αν θα το κάνεις πιο γρήγορα με τα libraries της Java.

 

Η library συναρτήσεις της C, κάνουν αυτό ακριβώς που σας έδειξα.

 

Δημοσ.

Δεν εχω αποψη για το αν θα γινουν πιο γρηγορα..παρολα αυτα δεν νομιζω οτι μπορει να υπαρξη μεγαλη διαφορα στην επιδοση , μιας και τα αντιστοιχα library της Javα , πιστευω οτι ειναι εξισου optimized. Παρολα αυτα ειμαι οπαδος της αποψης οτι αφου εχει γραφτει κατι και κανει σε μεγαλο βαθμο την δουλεια σου , δεν χρειαζεται να το ξαναγραψεις μονο αν εχεις πραγματικα αναγκη!

 

Aλλα δεν το ειπα να για να σνομπαρω...sorry αν ακουστηκε ετσι. ειπα ακαδημαικα και λογαριθμικά ειναι ενδιαφερουσες.

 

Παρολα αυτα η παραπανω διαφωνεια μας.,.ειναι μια μεγαλη συζητηση..δηλαδη αν χρειαζεται και ειναι εφικτο να ανακαλυτεις τον τροχο καθε φορα ή να χρησιμοποιεις κατι ετοιμο και δοκιμασμενο..και να επικεντρωνεσαι σε application specific προβληματα!

 

 

 

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...