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 位精度.
我也知道浮子的精度是7位数.
不是.最常见的浮点格式是二进制格式,精度为24位.它介于6到7位十进制数字之间,但如果您想了解舍入工作的方式,则无法用十进制表示.
由于b是2的幂,c是完全可表示的.在十进制表示转换期间,将发生舍入.获取十进制表示的标准方法不提供使用截断而不是舍入的可能性.一种方法是要求多一个数字并忽略它.
但请注意,c完全可表示的事实是其值的属性.SOme显然更简单(如0.1)没有二进制FP格式的精确表示.
| 归档时间: |
|
| 查看次数: |
28188 次 |
| 最近记录: |