C 我的浮点数在打印时有额外的数字
我将浮点数定义为C 我的浮点数在打印时有额外的数字,c,floating-point,C,Floating Point,我将浮点数定义为float transparency=0.85f
float transparency=0.85f在下一行中,我将其传递给一个函数--fcn\u name(transparency)
--但结果是变量transparency
有值0.85000002
,当我使用默认设置打印它时,它是0.85000002
。对于值0.65f
,它是0.6499998
我怎样才能避免这个问题?我知道浮点只是一个近似值,但如果我定义一个只有几个小数的浮点,我如何确保它不被更改?我能想到的解决这个问题的唯一方法是将特征和尾数分别传递给函数,让它适当地设置值
如果你想更精确
这是我知道的文章。虽然这只适用于C++。(搜索等效的C实现)
我在VS2010上试过这个
#include <stdio.h>
void printfloat(float f)
{
printf("%f",f);
}
int main(int argc, char *argv[])
{
float f = 0.24f;
printfloat(f);
return 0;
}
OUTPUT: 0.240000
#包括
无效打印浮动(浮动f)
{
printf(“%f”,f);
}
int main(int argc,char*argv[])
{
浮球f=0.24f;
打印浮动(f);
返回0;
}
产出:0.240000
以二进制格式表示的浮点值没有任何特定的十进制精度。仅仅因为你在一些规范中读到这个数字可以代表一些固定数量的十进制数字,它实际上并不意味着什么。这只是物理(和有意义的)二进制精度到其意义小得多的十进制近似值的粗略转换
二进制浮点格式的一个特性是,它只能精确表示(在尾数宽度的限制范围内)可以表示为2次幂的有限和(包括负2次幂)的数字。像0.5
、0.25
、0.75
(十进制)这样的数字将以二进制浮点格式精确表示,因为这些数字是2的幂(2^-1
、2^-2
)或其和
同时,像十进制0.1
这样的数字不能用2的有限次幂和来表示。十进制0.1
在浮点二进制中的表示具有无限长。这立即意味着0.1
永远无法以有限二进制浮点格式精确表示。请注意,0.1
只有一个十进制数字。然而,这个数字仍然无法代表。这说明用十进制数字表示浮点精度不是很有用
示例中的0.85
和0.65
等值也是不可表示的,这就是为什么在转换为有限二进制浮点格式后会看到这些值失真的原因。实际上,您必须习惯这样一个事实,即您在日常生活中遇到的大多数分数十进制数都不能用二进制浮点类型精确表示,无论这些浮点类型有多大。您不能。您将获得与输入源中的常量最接近的可表示浮点数。您可以通过使用double
s而不是float
s来减轻影响。使用精度更高的类型(如果需要!)。你甚至可以考虑不要使用(0…1)范围,而是(0…100)范围,这样你就可以更好地逼近你管理的数字。在所有计算结束时,您可以除以100。请阅读。如果您总是使用2位小数,您可以自由地将代码转换为整数(只需将所有内容按100进行缩放)。无论您的浮点类型有多大,这些值都无法以二进制浮点格式精确表示。切换到double
将减少错误,但错误仍然存在。您可以编造一个64KB的浮点类型,错误仍然存在,原因很简单,因为浮点二进制中0.65
的表示具有无限长。这不是浮点与定点的问题。这是一个根本问题。例如,如果您有一个包含8个整数位和8个分数位的二进制定点格式,它将无法准确表示.85。@EricPostFischil这就是为什么我要求他分别发送特征和尾数的原因。例如:这里的特征是0,尾数是75,如果他想要准确,让程序来处理。要求他分别传递特征和尾数并不能纠正答案中第一句是假的问题。我建议您编辑答案以删除错误陈述“唉,这是浮点数的问题,而不是固定点数。”(此外,我认为没有理由对短语“浮点”和“固定点数”使用代码样式。它们不是代码。为了强调,您可以使用粗体或斜体。)