如果我賦值一個大于16777215的23位指數怎么還原回來十進制數?超過23位后面的尾數1和0怎么取舍?
uj5u.com熱心網友回復:
https://www.cnblogs.com/fengliu-/p/7455246.html建議了解一下這個~
uj5u.com熱心網友回復:
看我的問題在回答,我不是要你告訴我單精度是怎么存盤的。我的問題是如果尾數超出23位后怎么轉換成十進制比如 我定義一個float016777219二進制是1.00000000000000000000011*24尾數已經24位了超出尾數表示范圍了。單結果是16777220是為什么 我的問題是如果指數超過23位后比如指數是25怎樣還原十進制uj5u.com熱心網友回復:
自定義想要的資料型別,多載需要的計算方式。uj5u.com熱心網友回復:
浮點數是表示范圍大, 但是精度不高, 23位二進制精度用10進制就是6-7位精度, 超過的精度會丟失f=16777219.0
e=log(f)/log(2)
e=0+(e|0)
m=(1<<23)
n=(f/pow(2,e) - 1.0)
n=n*m
n=((n+0.5)|0) //這里四舍五入, 精度丟失
h = 0 | ((e+0x7f)<<23) | n // 這里是16進制儲存資料
v=h&(m-1)
v=(v+0.0)/m
f=(1.0+v)*pow(2,e) // 這里最終結果成了 16777220
以下是計算步驟:
f = 16777219.00000000
16777219.00000000
e = log ( f ) / log ( 2 )
e = 16.63553251225261 / log ( 2 )
e = 16.63553251225261 / 0.6931471805599453
e = 24.00000025797396
24.00000025797396
e = 0 + ( e | 0 )
e = 0 + 0x0000000000000018
e = 24
24
m = ( 1 << 23 )
m = 0x0000000000800000
0x0000000000800000
n = ( f / pow ( 2 , e ) - 1.000000000000000 )
n = ( f / 16777216.00000000 - 1.000000000000000 )
n = ( 1.000000178813934 - 1.000000000000000 )
n = 1.788139343261719E-007
1.788139343261719E-007
n = n * m
n = 1.500000000000000
1.500000000000000
n = ( ( n + 0.5000000000000000 ) | 0 )
n = ( 2.000000000000000 | 0 )
n = 0x0000000000000002
0x0000000000000002
h = 0 | ( ( e + 0x000000000000007F ) << 23 ) | n
h = 0 | ( 151 << 23 ) | n
h = 0 | 0x000000004B800000 | n
h = 0x000000004B800000 | n
h = 0x000000004B800002
0x000000004B800002
v = h & ( m - 1 )
v = h & 0x00000000007FFFFF
v = 0x0000000000000002
0x0000000000000002
v = ( v + 0.0000000000000000 ) / m
v = 2.000000000000000 / m
v = 2.384185791015625E-007
2.384185791015625E-007
f = ( 1.000000000000000 + v ) * pow ( 2 , e )
f = 1.000000238418579 * pow ( 2 , e )
f = 1.000000238418579 * 16777216.00000000
f = 16777220.00000000
16777220.00000000
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/15851.html
標籤:C語言
上一篇:c語言多重for回圈如何優化
下一篇:C語言運行完自動關閉視窗
