gpt4 book ai didi

c - 在 C 中 float 和加倍

转载 作者:太空宇宙 更新时间:2023-11-04 05:36:30 26 4
gpt4 key购买 nike

以下程序的输出是否正确?我在 X86_64 Windows 系统上使用 Cygwin64 GCC 编译器。该架构是小端。

#include <stdio.h>

int main(int argc, char *argv[])
{
int i = 0;
float floatVal = 0x12345678;
do
{
printf("Hello World %f\n", floatVal);
floatVal++;
i++;
} while ( i < 10 );
return 0;
}

Hello World 305419904.000000
Hello World 305419904.000000
Hello World 305419904.000000
Hello World 305419904.000000
Hello World 305419904.000000
Hello World 305419904.000000
Hello World 305419904.000000
Hello World 305419904.000000
Hello World 305419904.000000
Hello World 305419904.000000

问题一:然而这个网站给了我一个完全不同的答案:http://www.binaryconvert.com/result_float.html?hexadecimal=12345678

问题二:为什么值(value)没有增加?但是,如果我使用 double 而不是 float,就会发生增量。

我做错了什么?


编辑,得到正确答案后:

从 unwind 得到正确答案后,我有一个进一步的问题,并在 Java 中做同样的事情。由于 Java 不使用 union ,有没有一种方法可以像 C 中接受的答案一样从整数转换为 float 。我在这里找到了答案:

How can I get/set individual bits in a float?

最佳答案

您期望整数文字 (0x12345678) 用于设置 float 的位,但事实并非如此。

相反,您得到的是实际整数(0x12345678 是十进制的 305419896);你的代码和上面说的完全一样

float floatVal = 305419896;

十六进制数只是一个整数,它的十六进制没有特殊意义。

要执行您想要的操作,您可能需要使用实际的 hexadecimal float constant,但这有点复杂。

您可以对其中的位使用union:

const union {
int integer;
float real;
} pair = { .integer = 0x12345678 };
float floatVal = pair.real;

请注意,如果大小不匹配,并且(如您所知)特定于字节序,则上述内容未定义。

如果您使用 %e%g 进行打印,您将得到您期望的结果:

printf("%g\n", floatVal);

在 ideone.com 上打印 5.69046e-28

关于c - 在 C 中 float 和加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33777611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com