• Ce forum est la traduction générée par la machine de www.cad3d.it/forum1 - la communauté italienne du design. Plusieurs termes ne sont pas traduits correctement.

Comment éviter la notation scientifique

  • Auteur du sujet Auteur du sujet Gio_S
  • Date de début Date de début

Gio_S

Guest
Bonjour tout le monde,
Je deviens fou. J'écris sur des fichiers, mais pour ma commodité d'analyse, je voudrais écrire toujours nombres en notation décimale.
Au lieu de cela, où par exemple il y avait rotation, et le nombre toujours approché par les virgules mobiles, je trouve au milieu du fichier certains nombres dans la notation scientifique.
Et pourtant j'utilise tous les trucs. .
Je répète dans la lisp les paramètres que je tiens déjà par défaut (setvar "lunits" 2) (setvar "luprec" 8). .
Je promets de convertir en chaîne comme ceci, par exemple (rects xn 2 8)Mais rien à faire ! De temps en temps, il me fait sortir son bien 4 44089210- 16 Et comme ça !
Je demanderais... Est-ce que j'appelle n'importe quoi ou mon autolisp sur Intellicad sur ce truc est clameur de bugs ?
Je vous remercie !
jupes
 
dans autolisp:"...les numéros réels sont stockés au format mobile à double précision, fournissant au moins 14 chiffres de précision significatifs, malgré Compaiano solo 6 dans la zone de la ligne de commande automatique."si vous devez les voir, vous pouvez utiliser rtos, tandis que dans les calculs pour vous rien ne change si dans les variables est stocké 1.0e-05 au lieu de 0.00001
 
dans autolisp:"...les numéros réels sont stockés au format mobile à double précision, fournissant au moins 14 chiffres de précision significatifs, malgré Compaiano solo 6 dans la zone de la ligne de commande automatique."si vous devez les voir, vous pouvez utiliser rtos, tandis que dans les calculs pour vous rien ne change si dans les variables est stocké 1.0e-05 au lieu de 0.00001
Oui ! C'est mon problème, rtos me donne une chaîne de notation scientifique même si avec le sujet de rtos je demande la notation décimale.
Je ne sais pas à ce stade s'il s'agit d'une faute de mon lisp ou s'il est généralisé, en ce sens que, cependant, lorsque le point a beaucoup de décimales (cause surtout par les opérations dans les virgules mobiles), le lisp me le renvoie encore dans la notation scientifique.
Cette chose m'amène derrière tout le problème des opérations de flotteurs, qui vont à approximation avec un ensemble de décimales, et me dérange dans les comparaisons entre les chaînes.Exemple:Si vous dessinez un cube en utilisant les tops toujours placés sur les coordonnées entre 0 et 1 (nombres complets), vous aurez des coordonnées propres. J'ai fait le cas le plus simple.
mais si vous dessinez un visage 0,00 - 0,10 - 1,1,0,0 (nombres entiers) et à partir de ce premier visage des visages de flic et de ruoti pour créer le cube, en raison des opérations dans les virgules mobiles, certains (à l'intérieur) vont bénir, en particulier dans le calcul de la normale, et vous obtenez plutôt décimales tels de rappeler toujours La notation scientifique, même si je ne la veux pas sur les fichiers texte.
le seul moyen (scomodo) est d'économiser dans dxf demandant seulement quelques décimales (généralement je demande 6), et à ce point le flotteur est tronqué et de retour au dessin avec les points propres.
la même chose que je pourrais obtenir avec l'argument rtos qui demande huit décimales si cependant cet argument ne m'a pas ignoré et m'a toujours donné la virgule mobile.
C'est compliqué à expliquer même si le concept est simple.
 
J'ai trouvé le truc ? sans la transformation double carpiata interne ne fonctionne pas, mais avec cela il semble être
Code:
 (défun clea(a)
(entre a)
(entre (* entre 1000)
(fixer entre)
(setq hh (rtos entre 2 et 8) ; nécessaire !
(entre (en hh)
(si (= entre 0) (setq entre 0,0000001))
(entre (/ entre 1000)
)
dans le principal, chaque valeur à écrire est donc d'abord traité ainsi
(Clear ax) (setq ax tra)
(Clear ay) (setq ay tra)
(clea az) (setq az tra) .... et la notation exponentielle disparaît en faveur de l'arrondi
 
ps ... il y a une blague au milieu pour éviter la division par zéro dans le calcul qui fera pour obtenir les vecteurs de la normale
 
a placé le code qui s'est amélioré, je le trouve important pour l'impression 3d et les rendus.
Je réponds parce que.
dans ce type de dessins, il est nécessaire que les points utilisés par ces programmes, s'ils doivent être égal ils sont vraiment, tandis que le cad, après les opérations en virgule mobile (généralement rotations) compromet son intégrité.
également ici sur le forum j'ai lu le sujet qui a signalé le problème pour des éléments avec une coïncidence non parfaite.
Je vais vous expliquer, dans un maillage x = 13,7865000 n'est pas égal du tout 13.7864999, généré dans le cad par les opérations mobiles des virgules, et si le programme d'impression ou de le rendre les trouve correctement différents, il peut tirer des conclusions erronées sur l'intégrité du maillage.
mon problème n'était pas seulement cela, mais aussi (voir le titre du sujet) n'ayant pas de notation exponentielle, que cad propitine parfois sur l'écriture de fichiers, même quand avec rtos je déclare que Je ne veux pas.. (première option déclarée à "deux" (note finale).

la seule façon d'éviter cela était de déplacer temporairement la virgule de trois places. Si j'ai déplacé 4, avec le *10000 puis est retourné à /10000, rien pour faire la notation "et" s'est distingué.
Je classe donc le flotteur (en utilisant le * et / seulement à 1000) exactement à trois décimales, mais que je suis certainement assez, tous les deux sur les travaux d'impression 3d, où mon Unité pour mesurer l'assume au millimètre, à la fois pour l'architecture, où je prends le compteur, et je ne me soucie certainement pas du dixième de millimètre.

mais il y a une autre question, la solution tronquée autolisée, pas ronde.
J'ai plutôt réduit à trois décimales après la virgule que je veux approximation de l'arrondi plus prèsEt ne fais pas court. et j'ai donc ajouté les routines que je crois appropriées puisque la fonction ronde dans l'autolisp classique n'est pas là.
Donc cette fonction... qui pour l'instant semble agir sans erreur.

C'est probablement redondant, mais je préfère, et d'ailleurs je ne sais pas si j'ai bien compris le concept, mais il me touche "pour reprendre" l'argument que j'ai passé à la fonction d'une variable interne à la fonction, parce que (je ne sais pas si j'ai tort) mais le défi garde seulement en région Les changements que je lui fais faire faire sur le sujet que j'ai vécu.
Quand je sors des morts, je le trouve comme tel et comme je l'ai passé à l'origine. d'ici, c'est pourquoi je prends du "entre" dans les morts la nouvelle valeur traitée localement. et je dois le donner au sujet.
C'est une sorte de désordre, mais je ne sais pas ce que tu peux faire de plus élégant. au cas où il y aurait une méthode du type le plus envoyé merci...
Je veux dire du type mort I call(x) ... et out x contiendra la nouvelle valeur que j'ai calculée à mon nom..
Je n'ai pas réussi, les variations x restent toujours locales à la fonction. . . .
Code:
 (pourfun propre(a)
(entre a)
(entre (* entre 1000)
(setq entre (fixe entre)
(setq hh (rtos entre 2 et 3))
(entre (en hh)
(entre (/ entre 1000)
; procédure ronde
(si) entre 0 et positif
(progrès)
(setq diff (- entre)
(si)
(entre (+ 0,001))
)
)
(progrès)
(setq diff (- entre)
(si (< diff -0.000)
(entre (- entre 0,001))
)
)
)
); fin défun propre
dans le principal, chaque valeur traitée, après l'appel aux morts, je dois le récupérer de "tra", traité dans la fonction sur une copie de ax, et le réaffecter au sujet
(Hache propre)
(setq ax entre)
mais comme je l'ai dit, je ne peux rien faire d'autre, parce que l'argument ax est modifié par la fonction, mais seulement en tant que variable locale.
 

Statistiques du forum

Sujets
58 521
Messages
499 056
Membres
104 110
Dernier membre
ChristianR

Membres en ligne

Aucun membre en ligne actuellement.
Retour
Haut