【问题标题】:Why does this float have 2 different values?为什么这个浮点数有 2 个不同的值?
【发布时间】:2018-11-26 09:35:15
【问题描述】:

当我这样做时:

float add=0;

int count[] = {3, 2, 1, 3, 1, 2, 3, 3, 1, 2, 1}
for (int i=0; i<11; i++)
    add += 1 / ((float)count+1);

输出是:

4.00000000000000000000

但是当我这样做时:

float add=0;

int count[] = {3, 2, 1, 3, 1, 2, 3, 3, 1, 2, 1}
for (int i=0; i<11; i++)
    add += 1.0 / ((float)count+1);

输出是:

3.99999976158142089844

当我需要将 int 转换为 float 时,我要么在前面添加 (float),要么让它使用诸如 a / 1.0 之类的小数进行算术运算。有什么区别吗?

编辑: 添加所需的行为。

原因是之后,我需要一个将add 添加到另一个 int 变量的结果,用于 int 输出。但是,当我使用第二种方式时,int 使用 3 而不是 4,所以我想知道第一个和第二个代码有什么区别。

【问题讨论】:

  • 在发布任何问题之前,请确保您的代码没有错误。
  • 1) 你不能在 C 中声明 int count=[3 2 1 3 1 2 3 3 1 2 1] 2) 浮点运算不是你想的那样
  • 这在我看来不像 C。
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example
  • 即使你把它设为合法的C,最大的区别在于1.0 is a double,因此整个表达式将以双精度完成,而1 / ((float)count+1)以浮点精度完成

标签: c floating-point int


【解决方案1】:

您的代码不是 C,但这是:

#include <stdio.h>

int main ()
{
        float add = 0;
        int count[] = { 3, 2, 1, 3, 1, 2, 3, 3, 1, 2, 1 };
        for (int i = 0; i < 11; i++) {
                add += 1 / ((float) count[i] + 1);
        }
        printf("%f\n", add);
        return 0;
}

我已经用add += 1 / ((float) count[i] + 1);add += 1.0 / ((float) count[i] + 1); 执行了这段代码。

在这两种情况下,printf("%f\n", add); 都会打印出4.000000

但是,当我打印变量add 的每一位时,它给了我01000000011111111111111111111111 (3.9999998) 和01000000100000000000000000000000 (4)

正如 phuclv 所指出的,这是因为 1.0double,因此计算是使用双精度完成的,而当使用 1 时,计算是使用单精度完成的(因为强制转换为浮点数)。

如果您将第一个等式中的强制转换替换为double,或者如果您将第二个等式中的1.0 更改为1.0f,您将获得相同的结果。

【讨论】:

  • "简单精度" ==> "单精度" ?
  • 整个计算实际上并不是用双精度完成的,只是对add的除法和加法。 ((float) count[i] + 1) 仅以单精度完成。数值结果与本例中的小值相同,但与其他数据不同。
猜你喜欢
  • 1970-01-01
  • 2015-03-05
  • 2018-09-29
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2010-09-12
  • 1970-01-01
相关资源
最近更新 更多