提问者:小点点

用铸件加宽精度会导致多少精度?


我知道扩大转换是安全的,因为它们不会导致数据丢失,但是精度是否有真正的提高,还是具有相同数量的重要数字的更长的表示?

例如,

#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位精度吗?


共1个答案

匿名用户

你的问题的答案似乎是显而易见的。因为doubleflot拥有更多的精度,所以如果你直接分配给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”,第二个看起来更接近。你的第一个输出有这种错误的、明显的精度,因为显示的数字很少,而且幸运的舍入。