#define加倍 - 不同的价值?

时间:2014-02-17 09:49:03

标签: c++ c double c-preprocessor

以下是我定义相同值的两种不同方式。我希望它作为64位(双精度)浮点数(也称为double)存在。

#define THISVALUE -0.148759f

double myDouble = -0.148759;

如果我执行以下操作

double tryingIt = THISVALUE;

我在调试期间查看该值或打印它,我可以看到它将tryingIt分配给 -0.14875899255275726

我知道浮点数不准确,但这只是一个疯狂的差异,真正抛弃了我的数学。直接在顶部代码块中分配double会在调试器中给出一个 -0.14875900000000000 的值 - 正是它应该是什么。

关于什么事情的任何想法?

2 个答案:

答案 0 :(得分:14)

f

中有define个结尾标记
#define THISVALUE -0.148759f
                           ^
                           |

这意味着有问题的文字是float精度,而不是您需要的double默认值。删除该字符。

答案 1 :(得分:14)

由于-0.148759f不是double,因此它是float。因此,几乎可以肯定的是,不同的精度正在发挥作用。

这两种变体中的任何一种都应该给你相同的结果:

#define THISVALUE -0.148759
double myDouble = -0.148759;  // Both double.

#define THISVALUE -0.148759f
double myDouble = -0.148759f; // Both float.

IEEE754单精度值(常用于float)只有32位可用,因此与双精度值(64位)相比,其范围和精度有限。

根据the Wikipedia page on IEEE754,范围和精度的粗略数字为:

  • 对于singles,范围±10±38精确到7位数。
  • 对于doubles,范围为±10±308,精度为15位。

而且,顺便说一下,现在使用宏的原因还不止于函数对象。前者可以使用inline建议和良好的编译器来完成,后者可以使用const int(或者在您的情况下为const double)完成,而不会丢失编译阶段之间的任何信息(如名称之类的东西)和类型信息)。