c++ - 将 float 转换为 float/int 后返回不同的结果

标签 c++ c types casting

在我的原始代码中,它是,

approach += sign * (1.0/n);

但在添加 float 转换后:

approach += sign * (float)(1.0/n);

最终结果发生了变化。 approach 被定义为 float,而 signn 被定义为 integers。 据我所知,1.0/n 应该将 n 转换为 float,在第一个版本中它应该相当于

approach += sign * (1.0/(float)n);

(1.0/(float)n) 本身就是一个 float ,将 float 转换为它应该不会有任何区别。 显然我的逻辑有问题,请指出。

最佳答案

1.0/n 不应将 n 转换为 float,而是转换为 double,因为 1.0double

(1.0/(float)n) 不是 float 而是 double 因为 1.0double(float)n 在计算之前将提升为 double

您可以将 1.0f/nfloat 文字 1.0f(以 f 作为后缀)一起使用来将 n 转换为 float 并进行计算。

通过这段代码,如果环境中floatdouble的大小不同,你可以看到(float)(1.0/n)<的大小(1.0/(float)n) 不同。

#include <stdio.h>

int main(void) {
    float approach, init = 3.14;
    int sign = 1, n = 10;

    printf("sizeof(float) = %zu\n", sizeof(float));
    printf("sizeof(double) = %zu\n", sizeof(double));
    printf("sizeof(long double) = %zu\n", sizeof(long double));
    printf("sizeof((1.0/n)) = %zu\n", sizeof((1.0/n)));
    printf("sizeof((1.0f/n)) = %zu\n", sizeof((1.0f/n)));
    printf("sizeof((float)(1.0/n)) = %zu\n", sizeof((float)(1.0/n)));
    printf("sizeof((1.0/(float)n)) = %zu\n", sizeof((1.0/(float)n)));

    approach = init;
    approach += sign * (1.0/n);
    printf("(1.0/n) : %.30f\n", approach);
    approach = init;
    approach += sign * (1.0f/n);
    printf("(1.0f/n) : %.30f\n", approach);
    approach = init;
    approach += sign * (float)(1.0/n);
    printf("(float)(1.0/n) : %.30f\n", approach);
    approach = init;
    approach += sign * (1.0/(float)n);
    printf("(1.0/(float)n) : %.30f\n", approach);
    return 0;
}

关于c++ - 将 float 转换为 float/int 后返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36223310/

相关文章:

c++ - 未定义对 `vtable for implementation' 错误的引用

c++ - #if 在#define 里面?

c - 68HC11 上使用 4 字节数字的斐波那契数列

c - 子类化 ListView 以仅编辑其子项

function - 函数的 Kotlin 类型不匹配返回字符串

c++ - 沿枚举 C++ 返回变量类型

c++ - PI调节比例积分算法的公式

c - 为什么 &x + 1 不会导致段错误?

列表类型错误的 Haskell 列表

c++ - 为什么当我在 Ubuntu 终端上发送 SIGTERM (Ctrl + C) 时我的 C++ 代码没有终止?