单精度不保证6位数?

mar*_*zzz 1 c++ floating-point

这是代码:

typedef std::numeric_limits<float> fl;

int main()
{   
    std::cout.precision(100);    

    float f1 = 9999978e3;
    std::cout << f1 << " (9999978e3 decimal number stored as binary)" << std::endl;

    float f2 = 9999979e3;
    std::cout << f2 << " (9999979e3 decimal number stored as binary)" << std::endl;

    float f3 = 9999990e3;
    std::cout << f3 << " (9999990e3 decimal number stored as binary)" << std::endl;

    std::cout << "-----^" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

打印:

9999978496 (9999978e3 decimal number stored as binary)
9999978496 (9999979e3 decimal number stored as binary)
9999989760 (9999990e3 decimal number stored as binary)
-----^ 
Run Code Online (Sandbox Code Playgroud)

存储为二进制的十进制数正确保持第6位9999978e39999979e3(即7),但第6位9999990e38而不是9.

不应该浮点精度始终保证前6位数?

是的,如果我在第89轮比赛中得到9分,那就不一样了; 这将只在"视觉上"工作/有意义.

稍后(关于处理数字),当我将对该值应用数学时,它将对xxxxx8数字(99999 8 9760)起作用,而不是在数字上xxxxx9.这个数量级为+1.

Bat*_*eba 8

不是你认为它有保证的方式,不是.

通过提供一个反例,对于IEEE754单精度浮点,最接近的数字

9999990000
Run Code Online (Sandbox Code Playgroud)

9999989760
Run Code Online (Sandbox Code Playgroud)

什么保证的是,你的电话号码和float,当两者都四舍五入到六个显著的数字,将是相同的.这是FLT_DIG您平台上的价值,假设它实现了IEEE754.例如,最接近的float数字99999790009999978496.

http://www.exploringbinary.com/floating-point-converter/

  • “这给出了 6 到 9 位有效十进制数字的精度。如果将最多 6 位有效数字的十进制字符串转换为 IEEE 754 单精度表示,然后再转换回具有相同位数的十进制字符串,则最终结果应与原始字符串匹配。如果将 IEEE 754 单精度数字转换为至少有 9 位有效数字的十进制字符串,然后再转换回单精度表示形式,则最终结果必须与原始数字匹配。错误的? (2认同)