当我运行以下代码时,输出准确地是十进制数2 500。
(ubuntu上的g ++ 5.3.1)
#include<iostream>
#include<cmath>
using namespace std;
int main(){
cout.precision(0);
cout << fixed << pow(2.0,500.0);
return 0;
}
我想知道C ++如何以这种高精度将浮点数转换为其十进制字符串。
我知道2500可以用IEEE 754格式准确显示。但我认为mod 10
并divided by 10
可以在浮点数造成精度损失。进行转换时使用什么算法?
是的,对于2 500存在精确的双精度浮点表示形式。但是,您不应假定会pow(2.0,500.0)
产生此值。无法保证函数的准确性,尽管数学结果也可以很好地表示出来,但pow
您可能会发现由于不产生而产生的SO问题。pow(10.0, 2.0)
100.0
但是无论如何,要回答您的问题,从浮点二进制表示形式到十进制的转换通常并不依赖于浮点运算,对于最终结果的预期精度而言,这确实是不准确的。通常,准确的转换需要依赖大整数算法。例如,在2 500的情况下,朴素的算法将是将二进制写入的大整数重复除以1000…<500 zeroes in total>…
10。
在某些情况下,可以使用浮点算术,例如,利用IEEE 754双精度精确表示10到10 23的幂这一事实。但是,在二进制浮点和十进制浮点之间正确舍入的转换通常总需要大整数运算,并且在远离1.0的情况下尤其明显。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句