使用铸造扩大精度会产生多少精度?

时间:2014-07-29 10:40:04

标签: c++ floating-point-precision

我知道扩大转换是安全的,因为它们会导致no loss of data,但是精确度是否有实际增长,或者是否具有相同数量的重要数字?

例如,

#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 个答案:

答案 0 :(得分:3)

似乎问题的答案显而易见。由于doublefloat更精确,因此如果您直接指定double,则会获得更准确的值,如果您通过float则会失去精确度。

当你float i = 0.012530f; float时,float得到的0.012530double j = 0.012530;一样接近0.01253。至7位数,看起来像double

执行double时,float得到的doubledouble一样接近0.01253。

如果您将float转换为{{1}},则{{1}}的{​​{1}}与{{1}}一样接近0.01253。

您无法将数字输出与不同的精度进行比较,以确定哪个更接近。例如,假设正确的数字是0.5,并且您有两个近似值,“0.5001”和“0.49”。显然,第一个更好。但是,如果您显示第一个带有5个十进制数字“0.5001”而第二个只显示一个十进制数字“0.5”,则第二个看起来更接近。你的第一个输出具有这种虚假,明显的精确度,因为它显示数字和幸运四舍五入。