- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#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/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!