当我运行以下代码时,输出准确地是十进制数2500。
(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
会导致浮点数的精度损失。进行转换时使用什么算法? 最佳答案
是的,存在一个精确的2500 double 浮点表示形式。但是,您不应假定pow(2.0,500.0)
会产生该值。不能保证pow
函数的准确性,并且您可能会发现SO questions产生的reliance on big integer arithmetics没有产生pow(10.0, 2.0)
,尽管数学结果也可以很好地表示。
但是无论如何,要回答您的问题,从浮点二进制表示形式到十进制的转换通常不依赖于浮点运算,对于最终结果的预期精度而言,这的确太不准确了。通常,准确的转换需要ojit_a。例如,在2500的情况下,朴素的算法是将二进制100.0
中写入的大整数重复除以10。
在某些情况下,可以使用浮点运算,例如,利用IEEE 754 double 精确表示10到1023的幂这一事实。但是,在二进制浮点和十进制浮点之间正确舍入的转换通常总需要大整数运算,并且在远离1.0的情况下尤其明显。
关于c++ - 计算机如何将浮点数转换为十进制字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38435849/