gpt4 book ai didi

c - 为什么使用float变量计算和我想的不一样?

转载 作者:行者123 更新时间:2023-12-05 08:30:09 25 4
gpt4 key购买 nike

#include <stdio.h>

int main(void)
{
float r = 31.0f;
float pi = 3.14f;
float volume = 4.0f / 3.0f * pi * r * r * r;

printf("volume = %f\n", volume);

float k1 = 4.0f / 3.0f;
printf("k1 = %f\n", k1);

float k2 = k1 * pi;
printf("k2 = %f\n", k2);

float k3 = k2 * r;
printf("k3 = %f\n", k3);

float k4 = k3 * r;
printf("k4 = %f\n", k4);

float k5 = k4 * r;
printf("k5 = %f\n", k5);


return 0;
}

我是 C 的初学者。

我认为变量“k5”必须等于 4023.387207 x 31 = 124725.003417

(到目前为止,我了解到 float 变量精确到小数点后六位。)

但输出显示 k5 == 124725.000000

为什么会这样?

(我的英文不是很好,请谅解。)

最佳答案

在大多数系统上,值为 124725.000000 的 float 的十六进制值为 0x47f39a80

因此下一个可表示的float 将具有十六进制值 0x47f39a81,对应于值 124725.0078125000

124725.000000 和 124725.0078125000 之间的任何值都不能被 float 保存

所以你的四舍五入到第一个,即 124725.000000

将程序中的所有 float 更改为 double,您将得到另一个结果。

你可以试试这段代码:

#include <stdio.h>
#include <stdlib.h>

typedef union
{
unsigned u;
float f;
} MT;

int main(void)
{
if (sizeof(float) != sizeof(unsigned)) exit(1);

MT x;

x.f = 124725.0f;
printf("x.f = %.56f\n", x.f);
printf("x.u = 0x%08x\n", x.u);

x.u++;
printf("x.f = %.56f\n", x.f);
printf("x.u = 0x%08x\n", x.u);

return 0;
}

在我的系统上输出

x.f = 124725.00000000000000000000000000000000000000000000000000000000
x.u = 0x47f39a80
x.f = 124725.00781250000000000000000000000000000000000000000000000000
x.u = 0x47f39a81

顺便说一句:

I have learned so far that float variable is accurate up to six decimal points.

嗯,那不是真的。对于某些值范围,float 甚至不能显示一个小数点。对于其他一些值范围,float 甚至不能显示奇数。

关于c - 为什么使用float变量计算和我想的不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65807520/

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