1

我将浮点数定义为float transparency = 0.85f;And 在下一行中,我将它传递给一个函数——fcn_name(transparency)但事实证明该变量transparency具有 value 0.850000002,当我使用默认设置打印它时,它是0.850000002。对于价值0.65f,它是0.649999998

我怎样才能避免这个问题?我知道浮点只是一个近似值,但如果我定义一个只有几位小数的浮点数,我如何确保它没有改变?

4

2 回答 2

3

以二进制格式表示的浮点值没有任何特定的十进制精度。仅仅因为您在某些规范中读到该数字可以表示一些固定数量的十进制数字,它实际上并没有多大意义。它只是将物理(和有意义的)二进制精度粗略转换为其意义不大的十进制近似值。

二进制浮点格式的一个特性是它只能精确地表示(在其尾数宽度的范围内)可以表示为 2 的幂的有限和(包括 2 的负幂)的数字。像0.5, 0.25, 0.75(十进制)这样的数字将以二进制浮点格式精确表示,因为这些数字要么是 2 ( 2^-1, 2^-2) 的幂,要么是其和。

同时,十进制这样的数字0.1不能用2的有限幂和来表示。0.1浮点二进制中十进制的表示是无限长的。这立即意味着0.1无法以有限二进制浮点格式精确表示。注意0.1只有一位十进制数字。但是,这个数字仍然无法表示。这说明了用十进制数字表示浮点精度并不是很有用的事实。

0.850.65来自您的示例的值也是不可表示的,这就是为什么您在转换为有限二进制浮点格式后看到这些值失真的原因。实际上,您必须习惯这样一个事实,即无论这些浮点类型有多大,您在日常生活中会遇到的大多数小数小数都不能精确地表示为二进制浮点类型。

于 2012-10-23T22:02:41.037 回答
0

我能想到的解决这个问题的唯一方法是将特征和尾数分别传递给函数,让 IT 适当地设置值。

另外,如果您想要更高的精度,

http://www.drdobbs.com/cpp/fixed-point-arithmetic-types-for-c/184401992是我知道的文章。虽然这仅适用于 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
于 2012-10-23T21:36:54.047 回答