c - 除法和 float

标签 c floating-point floating-accuracy

任何人都可以帮助我为什么 x2 打印为零。 我猜是因为浮点表示 X1 被四舍五入了,有没有办法保持进动。

long double x1, x2;
x1= 0.087912088; // Note: 360/4095 = 0.087912088
x2 = 360/4095;
printf("%Lf, %Lf \n",x1, x2);

结果:

x1 =0.087912
x2= 0.000000

最佳答案

问题是整数截断 .. 您将两个整数相除 => 结果将是另一个整数,小数部分被丢弃。 (例如,在整数除法的实际结果为 3.9 的情况下,截断会使它变成 3(即它不四舍五入))。

在您的情况下,如果您将其更改为:

x2 = 360 / 4095.0;  /* one of the operands now has a decimal point */

你会得到

0.087912, 0.087912 

作为输出。

即,一旦除法运算符 / 的操作数一个或两个 是 float / double ,结果也将是(即,它将是“提升”到 float /双)。所以我可以将 x2 更改为

x2 = 360.0 / 4095.0;

x2 = 360.0 / 4095;

并且会得到与上面相同的结果。

如@chris 所述,仅使用 . 就足够了。

关于上面关于精度的问题:

你已经在使用 long doubles 了。我不认为在内部你可以改变任何东西,除非你使用一些特殊的库,但你当然可以显示更多的数字。例如,

  printf("%Lf, %.20Lf \n",x1, x2); 

会产生

  0.087912, 0.08791208791208791895 

最后,正如@edA-qa mort-ora-y 提醒我们的那样,您还可以 值转换为某些类型,但何时 这样做很重要。一个简单的示例(请注意,在任何情况下,赋值后的值都是 float,因为 vfloat):

float v = 0;
                     /* values shown are BEFORE assignment */
v = (5 / 2);         /* value is 2 due to integer truncation before assignment */
v = (float) (5 / 2); /* 2.0 as integer division occurs 1st, then cast to float */
v = (float) 5 / 2;   /* 2.5 since 5 becomes 5.0 through casting first. */

关于c - 除法和 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11060272/

相关文章:

c - 实现可变参数检查自定义字符串格式化函数

c - 如何在父进程重新启动时使子进程死亡

c - 为什么 access(2) 检查真实的 UID 而不是有效的 UID?

c++ - 使用 CImg 编写 TIFF 浮点图像

c - 如何在 C 中获得 round()/floor() 的对面?

math - float 学坏了吗?

c++ - sin() 和 sinf() 的浮点值

objective-c - 仅包含 C(或最小 ObjC..)的 ObjC 文件

c++ - 快速浮点运算的编译指示