C++浮点除法和精度

Nic*_*tch 10 c++ math floating-point

我知道511除以512实际上等于0.998046875.我也知道浮子的精度是7位数.我的问题是,当我用C++(GCC)进行数学运算时,得到的结果是0.998047,这是一个舍入值.我更喜欢得到截断值0.998046,我该怎么做?

  float a = 511.0f;
  float b = 512.0f;
  float c = a / b;
Run Code Online (Sandbox Code Playgroud)

Die*_*Epp 22

嗯,这是一个问题.511/512作为a 的值float是准确的.没有舍入.您可以通过要求超过七位数来检查:

#include <stdio.h>
int main(int argc, char *argv[])
{
    float x = 511.0f, y = 512.0f;
    printf("%.15f\n", x/y);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0.998046875000000
Run Code Online (Sandbox Code Playgroud)

A float不是以十进制数存储,而是以二进制形式存储.如果将数字除以2的幂,例如512,则结果几乎总是精确的.正在发生的是a的精度float不仅仅是7位数,它实际上是23 精度.

看看每个计算机科学家应该知道的关于浮点运算的内容.

  • 24位是由于通过保持数字归一化可以再获得一位. (4认同)

APr*_*mer 5

我也知道浮子的精度是7位数.

不是.最常见的浮点格式是二进制格式,精度为24位.它介于6到7位十进制数字之间,但如果您想了解舍入工作的方式,则无法用十进制表示.

由于b是2的幂,c是完全可表示的.在十进制表示转换期间,将发生舍入.获取十进制表示的标准方法不提供使用截断而不是舍入的可能性.一种方法是要求多一个数字并忽略它.

但请注意,c完全可表示的事实是其值的属性.SOme显然更简单(如0.1)没有二进制FP格式的精确表示.