我知道扩大转换是安全的,因为它们不会导致数据丢失,但是精度是否有真正的提高,还是具有相同数量的重要数字的更长的表示?
例如,
#include <iostream>
#include <iomanip>
int main()
{
float i = 0.012530f;
std::cout << std::setw(20) << std::setprecision(7) << i << std::endl;
double ii = (double)i;
std::cout << std::setw(20) << std::setprecision(15) << ii << std::endl;
double j = 0.012530;
std::cout << std::setw(20) << std::setprecision(15) << j << std::endl;
}
产生输出
0.01253
0.012529999949039
0.01253
查看调试器中的变量可以看出j
是四舍五入的,因为浮点数不能准确地表示原始数字,但它仍然是比ii
更精确的原始数字近似值。
i = 0.012530000
ii = 0.012529999949038029
j = 0.012529999999999999
为什么强制转换不如直接赋值精确?如果我扩大浮点数的精度,我只能指望8位精度吗?
你的问题的答案似乎是显而易见的。因为double
比flot
拥有更多的精度,所以如果你直接分配给double
,你会得到一个更精确的值,如果你通过flot
,你会失去精度。
当你做浮点数i=0.012530f;
时,你会得到一个浮点数
,它与浮点数
所能得到的最接近0.01253。到7位,看起来像0.012530
。
当你做double j=0.012530;
时,你会得到一个double
,它接近于0.01253。
如果您将浮点数
转换为double
,您会得到一个double
,它与浮点数
可以得到的接近0.01253。
你不能真正比较输出到不同精度的数字,看看哪个更接近。例如,假设正确的数字是0.5,你有两个近似值,“0.5001”和“0.49”。显然,第一个更好。但是如果你显示第一个有5个十进制数字“0.5001”,第二个只有一个十进制数字“0.5”,第二个看起来更接近。你的第一个输出有这种错误的、明显的精度,因为显示的数字很少,而且幸运的舍入。