以下是我定义相同值的两种不同方式。我希望它作为64位(双精度)浮点数(也称为double)存在。
#define THISVALUE -0.148759f
double myDouble = -0.148759;
如果我执行以下操作
double tryingIt = THISVALUE;
我在调试期间查看该值或打印它,我可以看到它将tryingIt
分配给 -0.14875899255275726
我知道浮点数不准确,但这只是一个疯狂的差异,真正抛弃了我的数学。直接在顶部代码块中分配double会在调试器中给出一个 -0.14875900000000000 的值 - 正是它应该是什么。
关于什么事情的任何想法?
答案 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
)完成,而不会丢失编译阶段之间的任何信息(如名称之类的东西)和类型信息)。