关于 C 中的 float 数据类型
about float datatype in C
我正在研究用 C 构建逻辑,我只是写了一个关于方程式的小代码。这是代码:
#include<stdio.h>
int main()
{
float a,b;
printf("Find solutions for equation: aX + b = 0\n");
printf("Input value for a: ");
scanf("%f", &a);
printf("Input value for b: ");
scanf("%f", &b);
if(a == 0)
{
if (b ==0)
{
printf("Countless solution.");
}
else
{
printf("Have no solution.");
}
}
else
{
printf("Have one solution: x = %.2f", -b/a);
}
}
问题是当我输入a=any number, b=0, 我的解决方案是:x= -0.00.
不明白为什么是x = -0.00
而不是x = 0.00
?
我已经测试了案例 a==0 && b==0
、a==0 && b!=0
并且它工作正常。
我对此感到困惑。谁能给我解释一下?
浮点数的IEEE标准表示允许负0。基本上,有一位表示浮点数的"sign"。当你翻转那个位时,符号被翻转。在您的示例中,当您使用值 -b
时,使用的值是 b
,其符号位已翻转。 0
其符号位翻转后是 -0
.
问题的简化概述是:
浮点数的精度受限于float类型的位数。因此,将任何浮点运算的结果分配给一个变量会给你一个非常非常接近的近似值,但不是一个精确的数字。
因此,IEEE 标准指定浮点数使用带符号的零表示。虽然这些值恰好为零,但带符号的变体可以比作接近零的单边极限(这样一个极限可以精确为零,但任何无限小的值都会有一个符号)。
C 表示法“-b
”与“-1 * b
”相同,因此如果 a
是正数且 b
是 0 的正符号版本,则该操作的结果将是零的负符号版本。
代码运行正常。许多浮点类型支持 +
和 -
零。
要避免打印出 -0.0
,请添加 0.0
printf("Have one solution: x = %.2f", -b/a + 0.0);
我正在研究用 C 构建逻辑,我只是写了一个关于方程式的小代码。这是代码:
#include<stdio.h>
int main()
{
float a,b;
printf("Find solutions for equation: aX + b = 0\n");
printf("Input value for a: ");
scanf("%f", &a);
printf("Input value for b: ");
scanf("%f", &b);
if(a == 0)
{
if (b ==0)
{
printf("Countless solution.");
}
else
{
printf("Have no solution.");
}
}
else
{
printf("Have one solution: x = %.2f", -b/a);
}
}
问题是当我输入a=any number, b=0, 我的解决方案是:x= -0.00.
不明白为什么是x = -0.00
而不是x = 0.00
?
我已经测试了案例 a==0 && b==0
、a==0 && b!=0
并且它工作正常。
我对此感到困惑。谁能给我解释一下?
浮点数的IEEE标准表示允许负0。基本上,有一位表示浮点数的"sign"。当你翻转那个位时,符号被翻转。在您的示例中,当您使用值 -b
时,使用的值是 b
,其符号位已翻转。 0
其符号位翻转后是 -0
.
问题的简化概述是:
浮点数的精度受限于float类型的位数。因此,将任何浮点运算的结果分配给一个变量会给你一个非常非常接近的近似值,但不是一个精确的数字。
因此,IEEE 标准指定浮点数使用带符号的零表示。虽然这些值恰好为零,但带符号的变体可以比作接近零的单边极限(这样一个极限可以精确为零,但任何无限小的值都会有一个符号)。
C 表示法“-b
”与“-1 * b
”相同,因此如果 a
是正数且 b
是 0 的正符号版本,则该操作的结果将是零的负符号版本。
代码运行正常。许多浮点类型支持 +
和 -
零。
要避免打印出 -0.0
,请添加 0.0
printf("Have one solution: x = %.2f", -b/a + 0.0);