计算机如何将浮点数转换为十进制字符串?
How does computer convert floating point numbers to decimal string?
当我运行下面的代码时,输出准确的是十进制数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 的精确双精度浮点表示。但是,您不应假定 pow(2.0,500.0)
会产生此值。不能保证函数 pow
的准确性,您可能会发现 pow(10.0, 2.0)
产生的 SO questions 没有产生 100.0
,尽管数学结果也可以完美表示。
但是无论如何,为了回答你的问题,从浮点二进制表示到十进制的转换一般不依赖于浮点运算,这对于最终结果的预期精度来说确实太不准确了。一般来说,准确的转换需要reliance on big integer arithmetics。例如,在 2500 的情况下,天真的算法将重复用二进制 1000…<500 zeroes in total>…
编写的大整数除以十。
有些情况下可以使用浮点运算,例如利用 10 到 1023 的幂在 IEEE 754 double 中精确表示-精确。但是二进制浮点数和十进制浮点数之间的正确舍入转换通常总是需要大整数运算,这在远离 1.0 时尤为明显。
当我运行下面的代码时,输出准确的是十进制数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 的精确双精度浮点表示。但是,您不应假定 pow(2.0,500.0)
会产生此值。不能保证函数 pow
的准确性,您可能会发现 pow(10.0, 2.0)
产生的 SO questions 没有产生 100.0
,尽管数学结果也可以完美表示。
但是无论如何,为了回答你的问题,从浮点二进制表示到十进制的转换一般不依赖于浮点运算,这对于最终结果的预期精度来说确实太不准确了。一般来说,准确的转换需要reliance on big integer arithmetics。例如,在 2500 的情况下,天真的算法将重复用二进制 1000…<500 zeroes in total>…
编写的大整数除以十。
有些情况下可以使用浮点运算,例如利用 10 到 1023 的幂在 IEEE 754 double 中精确表示-精确。但是二进制浮点数和十进制浮点数之间的正确舍入转换通常总是需要大整数运算,这在远离 1.0 时尤为明显。