2016-06-20 6 views
0

Je suis en train de convertir un programme du code Scilab en C++ et il est essentiel pour moi de maintenir les résultats produits par Scilab. Je suis conscient que Scilab utilise la double précision IEEE 754 et que les doubles C++ (bien que non requis) sont implémentés de la même manière.Si j'essaie de répliquer un programme dans une autre langue. Est-il imprudent d'utiliser plus de précision?

Est-ce donc une mauvaise idée d'utiliser une plus grande précision (par exemplelong double) en C++ si je suis en train de correspondre exactement aux résultats de Scilab?

Par exemple: Est-il possible pour Scilab de calculer un nombre à 0,1234 alors en C++ en utilisant le nombre double de long serait 0,12345. Ainsi, en créant potentiellement une variance qui entraînerait les deux programmes produisant différents résultats (bien que plus précis en C++).

+2

Je suis prêt à parier que vous n'obtiendrez jamais * exactement * des résultats identiques. Mais en as-tu vraiment besoin? –

+0

@JesperJuhl Techniquement parlant, je n'ai pas besoin des résultats pour être exact. Le problème est qu'il y a beaucoup de boucles dans mon programme et si la boucle initiale est désactivée par une infime fraction (ce qui est le cas), la différence de fin devient significative. –

+0

Si la différence de fin est significative, cela ne signifie-t-il pas que votre programme nécessite une plus grande précision que ce que permet le virgule flottante intégrée? – Galik

Répondre

1

Oui, c'est totalement possbile.

Mais puisque les nombres à virgule flottante ne sont jamais totalement précis, vous devriez concevoir votre algorithme en pensant à cela et essayer d'éviter que ces "erreurs d'arrondi" ne vissent vos calculs après un certain temps. Encore plus, comme déjà noté dans les commentaires: Ne vous attendez pas à ce que votre programme C++ produise exactement les mêmes résultats que le programme Scilab, surtout s'il est critique pour de petits changements. C'est pourquoi la plupart des simulations numériques ne sont précises à une certaine limite avant de commencer à produire de «mauvais» résultats.

Pour vous donner quelques conseils utiles, C++ a l'option très utile de typedefs. Utilisez un typedef comme typedef long double myFloatType et utilisez seulement myFloatType pour vos calculs (pensez à un meilleur nom, qui en dit plus sur ce qui est utilisé ici!). Ensuite, vous pouvez facilement le changer après, en changeant juste une ligne de code, et comparez les résultats.

Si la différence est significative, il pourrait être utile de penser à un meilleur algorithme.