gpt4 book ai didi

c - float变量不满足条件(C)

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:27 25 4
gpt4 key购买 nike

我试图让用户输入一个介于 1.00000 到 0.00001 之间的数字,同时边缘不包含在浮点变量中。我可以假设用户在点后输入的数字不超过 5 个。现在,这是我写的:

printf("Enter required Leibniz gap.(Between 0.00001 to 1.00000)\n");
scanf("%f", &gap);
while ((gap < 0.00002) || (gap > 0.99999))
{
printf("Enter required Leibniz gap.(Between 0.00001 to 1.00000)\n");
scanf("%f", &gap);
}

现在,当我键入可能的最小数字时:0.00002 陷入了 while 循环。当我运行调试器时,我看到 0.00002 与此值一起存储在浮点变量中:1.99999995e-005任何人都可以为我澄清我做错了什么?为什么 0.00002 不满足条件?这个“1.99999995e-005”是什么东西。

最佳答案

这里的问题是您使用的是 float变量 ( gap ),但您将其与 double 进行比较常数(0.00002)。常量是double因为除非另有说明,否则 C 中的浮点常量是 double 的。

一个潜在的问题是数字 0.00002float 中均不可表示或 double . (它根本不能用二进制 float 表示,因为它的二进制展开式是无限长的,就像 ⅓ 的十进制展开式一样。)所以当你写 0.00002 时在程序中,C 编译器将其替换为 double非常接近 0.00002 的值.同样,当scanf读取编号 0.00002进入float变量,它代替一个 float非常接近 0.00002 的值.自 double数字的位数多于 floats , double值更接近 0.00002float值(value)。

当您比较两个精度不同的浮点值时,编译器会将精度较低的值转换为精度较高的完全相同的值。 (表示为 double 的值集是表示为 float 的值集的超集,因此总是可以找到一个 double 其值与 float 的值相同。)这就是 gap < 0.00002 时发生的情况。被执行:gap转换为 double相同的值,并与双倍(接近)0.00002 进行比较.由于这两个值实际上都略小于 0.00002,并且 double更近了,float小于 double .

您可以通过多种方式解决此问题。首先,您可以通过 gap 来避免转换。一个double并更改 scanf格式为 %lf , 或者通过比较 gapfloat :

while (gap < 0.00002F || gap > 0.99999F) {

但出于几个原因,这并不完全正确。首先,实际上不能保证 C 编译器完成的浮点转换与标准库 (scanf) 完成的转换相同,标准允许编译器使用“最接近的可表示值,或者以实现定义的方式选择的与最接近的可表示值紧邻的更大或更小的可表示值。” (它没有详细说明 scanf 产生哪个值,但建议它是最接近的可表示值。)碰巧的是,gccglibc (Linux 上使用的 C 编译器和标准库)都产生最接近的可表示值,但其他实现不会。

无论如何,根据您的错误消息,您希望值介于 0.00001 之间和 1.00000 .所以你的测试应该是:

while (gap <= 0.00001F || gap >= 1.0000F) { ...

(假设您将 gap 保留为 float 。)

上述任何解决方案都可以。就个人而言,我会做 gap一个double为了让对比更直观,也把对比改成对比0.000011.0000 .

顺便说一句,E-05后缀表示“乘以 10 的 -5 次方”(E 代表 Exponent )。你会看到很多;这是编写浮点常量的标准方法。

关于c - float变量不满足条件(C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19871086/

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