1

Question simple: Est-ce que les approximations des calculs avec virgules flottantes en C++ sont identiques sur différent cpu ?
C'est à dire, est-ce que une suite de calculs avec des floats donnera toujours le même résultat, même sur différentes machines?

2

Ben si c'est fait 100% en soft on peut ce dire que ça va etre identique. Si c'est fait en hard il y auras surement des différences smile
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3

4

Alors je compile toujours avec gcc, pour windows et linux.

5

Jyaif (./1) :
Question simple: Est-ce que les approximations des calculs avec virgules flottantes en C sont identiques sur différent cpu ? C'est à dire, est-ce que une suite de calculs avec des floats donnera toujours le même résultat, même sur différentes machines?


Réponse rapide: oui mais
Réponse plus longue :
La norme IEE 754 a standardisé les calculs pour les opérations suivantes, + - * / et sqrt
Si tu n'utilises que ces opérations, ca peut être portable si tu trouves les options du compilateur qui vont bien (Voir les options que MPFR fixe dans son configure).

6

MPFR, ça à l'air d'être une lib. Je devrais utiliser une lib pour effectuer les calculs?

edit:
A non ok c'est bon, j'avais mal lu ton post: je peux m'aider de MPFR pour voir les options du compilo ^^

7

Tu peux utiliser MPFR si tu veux 100% de portabilité quelque soit le compilateur. Mais en 53 bits, tes calculs seront 20x plus lent (c'est une librairie multi-précision après tout).

8

Jyaif (./1) :
Question simple: Est-ce que les approximations des calculs avec virgules flottantes en C++ sont identiques sur différent cpu ?

Non. Déjà il y a les plateformes qui ne suivent pas le standard IEEE du tout (*ahem* TIGCC *ahem* c'est la faute de TI! fear), ensuite il y a les ...euh... "interprétations" bizarres des standards, l'offenseur principal étant la lignée x86 (instructions x87), qui malheureusement est la plus courante. (Tu peux forcer l'utilisation des instructions SSE qui sont moins bizarres avec -msse -mfpmath=sse sous GCC, mais ça ne marche que sur les CPUs qui gèrent le SSE, donc Pentium III minimum.)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

9

Bon, sans même activer d'optimisations j'ai des résultats différents sur 2 ordis différent, donc je pense que je vais passer à des calculs à virgule fixe. J'ai bien essayé de regarder le configure de MPFR, mais il fait 786Ko et je ne sais même pas quoi chercher. Je l'ai uploadé là, au cas où qlqun a envie de regarder...

Ce que j'aimerais savoir, c'est comment faire pour que le passage float => fixed point soit le moins douloureux possible, sachant que je programme en C++. Aussi, sachant que je fais à 99% des additions/multiplications/divisions, j'aimerais savoir si les performances ne seront pas trop détériorées, ou si au contraire elles seront meilleures.

10

Jyaif (./9) :
Bon, sans même activer d'optimisations j'ai des résultats différents sur 2 ordis différent, donc je pense que je vais passer à des calculs à virgule fixe. J'ai bien essayé de regarder le configure de MPFR, mais il fait 786Ko et je ne sais même pas quoi chercher. Je l'ai uploadé là, au cas où qlqun a envie de regarder...


Regarde acinclude.m4 et configure.in !

Sinon essaye:
if test "${GCC}" != "yes" ; then
    case "${build}" in
        *-*-hpux* )
	    AM_CFLAGS="${AM_CFLAGS} -Wp,-H30000"
            ;;
        *-dec-osf* )
            AM_CFLAGS="${AM_CFLAGS} -ieee"
            ;;
	*-apple-darwin* )
	    AM_CFLAGS="${AM_CFLAGS} -fno-common"
	    ;;
	*-sgi-irix* )
	    ;;
    esac
else
    case "${CC}" in
	*icc* )
	    # -Wall causes relocation errors with icc. 
	    AM_CFLAGS="${AM_CFLAGS}  -fp_port -mp -wd269"
	    ;;
        * )
            case "${build}" in
	        *-dec-osf* )
	            AM_CFLAGS="${AM_CFLAGS} -mieee -Wall"
	            ;;
                *alpha*-*-linux* )
                    AM_CFLAGS="${AM_CFLAGS} -mieee -Wall"
                    ;;
                *alpha*-*-freebsd* )
                    AM_CFLAGS="${AM_CFLAGS} -mieee -Wall"
                    ;;
	        *-apple-darwin* )
	            AM_CFLAGS="${AM_CFLAGS} -fno-common -Wall"
	            ;;
	        * )
	            AM_CFLAGS="${AM_CFLAGS} -ffloat-store -Wall"
	            ;;
            esac
	    ;;
    esac
fi

11

-ffloat-store = "je veux que mes flottants rament" roll
-msse -mfpmath=sse est une meilleure solution pour les x86.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

12

Plains toi à Intel. Je veux que mes flottants respectent la norme ! S'ils vont vite mais qu'ils respectent rien, je m'en fous, ca sert à rien.
Sinon pour -msse -mfpmath=sse, je ne suis pas sûr que ca ne pose pas de problèmes avec des librairies (à vérifier).

Il y a une autre solution qui consiste à modifier le registre de controle (fpu_control.h) pour passer en double, mais tu peux plus utiliser la libm en faisant çà sad