2014-02-17 42 views
5

以下是我定義相同值的兩種不同方式。我希望它存在一個64位(雙精度)浮點數(又名雙精度)。#定義雙 - 不同的價值?

#define THISVALUE -0.148759f 

double myDouble = -0.148759; 

如果我執行以下操作

double tryingIt = THISVALUE; 

,我看值調試過程中或打印出來,我可以看到它分配給tryingIt-0.14875899255275726

我明白浮點數並不準確,但這只是一個真正拋出我的數學的瘋狂差異。在調試器中直接指定double作爲頂級代碼塊給出的值爲-0.14875900000000000 - 正是它應該是的。

有什麼想法?

+5

大多數情況下,單精度文字「f」會導致您所看到的差異。 「-0.148759」是雙精度,「-0.148759f」是單精度。 – sgarizvi

+0

這是C還是C++? C/C++不存在。如果這是C,'#define'是(de)很好。如果不是,那麼有更好的選擇。 – JorenHeit

回答

12

因爲-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)的情況下完成,而不會在編譯階段(如名稱和類型信息)之間丟失任何信息。

+1

啊,我的錯!我認爲f需要指定float或double,而不僅僅是float。問題 - 我這樣做是爲了節省內存以適應非常內存緊張的環境......我想通過#define指令設置所有常量(其中有超過100個常量)會節省內存,因爲它只加載值當他們被要求時,他們會進入記憶,而不是一直在全球範圍內徘徊。建議? – Pugz

+0

@Pugz,​​它_may_可以節省內存,但是,除非你在1K可用的嵌入式系統上運行,否則100 x 8字節不會產生太大的改變:-) – paxdiablo

+1

這正是我正在運行的。呃,它差不多有2K。 :-) 有什麼建議麼? – Pugz

14

你必須在define尾隨f

#define THISVALUE -0.148759f 
         ^
          | 

這意味着在問題的文字是float精度,而不是double默認你需要的。刪除那個角色。