2012-10-23 37 views
0

我將浮點數定義爲float transparency = 0.85f;而在下一行中,我將它傳遞給函數 - fcn_name(transparency) - 但事實證明變量transparency的值爲0.850000002 ,當我用默認設置打印時,它是0.850000002。對於值0.65f,它是0.649999998當我打印時,我的浮點數有額外的數字

我該如何避免這個問題?我知道浮點數只是一個近似值,但是如果我定義一個只有幾位小數的浮點數,我怎樣才能確保它不被改變?

+2

用'double'代替? –

+0

你不行。你得到最接近浮點數的浮點數,這個浮點數是你放在源碼中的常量。你可以通過使用double而不是float來緩解這種影響。 –

+0

使用更高精度的類型(如果您需要它!)。你甚至可以考慮做**不使用[0..1]範圍,但是[0..100]範圍**,這樣你對你管理的號碼有更好的近似。在所有計算結束時,您可以除以100。 –

回答

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 
+0

這不是浮點與定點問題。這是一個基數問題。例如,如果你有一個8位整數和8個小數位的二進制定點格式,它將不能完全代表.85。 –

+0

@EricPostpischil這就是爲什麼我讓他分別發送特徵和尾數的原因。例如:這裏的特徵是0,尾數是75,如果他想要精度,讓程序處理這個。 –

+0

要求他分別傳遞特徵和尾數不能糾正答案中第一句錯誤的問題。我建議你編輯答案以刪除虛假陳述「唉,這就是浮點數的問題,而不是定點數」(另外,我沒有看到使用代碼風格的短語「浮點數」和「固定點」,它們不是代碼,爲了強調,可以使用** bold **或* italic *。) –

2

浮點值沒有任何具體的小數精度。只是因爲你讀了一些規格數字可以代表一些固定數量的十進制數字,這並不意味着太多。這只是將物理(和有意義的)二進制精度粗略轉換爲其無意義的十進制近似。

二進制浮點格式的一個特性是它只能精確表示(在其尾數寬度的範圍內)可以表示爲2的冪的有限和(包括2的負冪)的數。像0.5,0.25,, 0.75(十進制)這樣的數字將精確地以二進制浮點格式表示,因爲這些數字是2的冪(2^-1,2^-2)或它們的和。

同時,不能用的2的小數0.1的表示權力的有限和在浮點二進制表達了這樣的數目爲十進制0.1具有無限長度。這立即意味着0.1不能精確地以有限二進制浮點格式表示。請注意,0.1只有一個十進制數字。但是,這個數字仍然不能代表。這說明了以小數位表示浮點精度並不十分有用的事實。

您示例中的0.850.65等值也是不可表示的,這就是爲什麼您在轉換爲有限二進制浮點格式後看到這些值失真的原因。實際上,您必須習慣這樣一個事實,即日常生活中遇到的大多數小數十進制數不能精確表示爲二進制浮點類型,即,而不管這些浮點類型的大小是多少()。

相關問題