0

由於安全原因,我需要執行兩次相同的計算,一次只使用整數(int32)變量,而另一次只使用float(float32)變量。在計算結束時,兩個結果之間正在進行比較。在c/C++中比較float和整數

我閱讀了關於comparing floating point numbers的文章。

有幾件事情我不明白:

  1. 我還沒有爲浮點數以下壓縮:假設一個b的花車,是比較正確的是這樣的:

    如果!(A> b)& &!(一< b)是真的,那麼一個b可能是鑑定者否則不行。

  2. 如果我投一個浮點數爲整數,我得到的數量的整數部分,所以通過使用聯合對象有定義相同的內存INT32FLOAT32我得到不同的解決方案?它不會將浮點數轉換爲int32嗎?

+1

什麼是「我沒有以下壓縮的浮點數」是什麼意思? – 2014-11-22 11:01:48

回答

2

爲什麼通過使用聯合對象和定義有相同的內存作爲INT32和FLOAT32我得到不同的解決方案?

的唯一原因float/int union甚至有意義憑藉的事實,即floatint份額32-bitsstorage size。你所缺少的是floats(其實所有的浮點數)存儲在IEEE-754 Floating Point Format的理解(花車單精度,雙打雙精度,等..)

當您使用float/int union詭計,您看到integer valueinteger equivalentIEEE-754 Single-Precision Floating Point Formatfloat。這兩個值有什麼也沒有與代表相同的數字。你可以看看它們佔用的內存,作爲float或作爲integer,因爲它們都佔用內存的32-bits。如果您通過float窗口查看,您會看到那些32-bits表示爲float。另一方面,如果您看到32-bitsinteger相同,則只會看到32-bitsinteger相同的情況。查看二進制表示的示例通常會有所幫助。

取例如,float的值爲123.456。如果您在內存看32-bits看到:

The float value entered : 123.456001 

binary value in memory : 01000010-11110110-11101001-01111001 

As unsigned integer  : 1123477881 

的IEEE-754單精度浮點表示是內存中的特定浮點格式由以下三部分組成:

0 1 0 0 0 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 1 1 0 0 1 
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| 
|s|  exp  |     mantissa     | 

其中ssign-bit,expbiased exponent而其餘的23-bits被稱爲mantissa。您無法預計投下float 123.456並獲得任何接近integer 123的東西,您off by 7 orders of magnitude

它不會將浮點數轉換爲int32嗎?

答:沒有

1
  1. 假。例如,ab都是nan,在這種情況下,a < b,a > b,a == b都是錯誤的。
  2. 因爲整數和浮點數的表示方式不同。當您投射floatint(例如,1.0f1)時,其存儲器不相同。
2
  1. 假。在浮點類型中,除了像nan和inf這樣的特殊數字之外,比較與整數相同。如果a的值完全等於b,即12.345 == 12.34512.345 < 12.346始終返回true。如果你需要比較該值足夠接近對方,使用埃普西隆像FatihK

  2. 一個簡單的強制轉換爲int喜歡(int)some_double_value將簡單地返回some_double_value的。但是如果你把它存儲到一個工會和讀出這樣的整數,它會返回表示浮法

例如(INT)2.5 == 2,但二進制表示的記憶在IEEE-754 double precision中是2.5是0x4004000000000000