簡體   English   中英

雙精度浮點數

[英]double precision floating point

我正在嘗試讀取二進制八字節浮點數並將它們轉換為十進制。 我能夠毫無問題地讀取和轉換英文單詞無符號 8 位 ASCII。 如果雙精度的字節順序與 1 字節字符的字節順序相同,我應該能夠復制我在其自己的專用軟件中查找的頭文件的值。 以下是其中一個標頭類實際上在其標頭中包含的內容,這是從為此目的的專用軟件中獲得的:“第 3 類

  utdate:      2022.051500

      ut:         7.089062

     lst:        15.180985

 norchan:         1.000000

 noswvar:         1.000000

 nophase:         1.000000

 cycllen:         1.000000

 samprat:        30.000000

cl11type:         PROTO12M

"

以下是我使用 python 腳本提取字節的這部分標題的位字符串:“ Class 3 Header Observing Parameters

01000000 10011111 10011000 00110100 10111100 01101010 01111110 11111010

01000000 00011011 11111100 10111000 00001000 10111011 11101011 00010001

01000000 00101110 00101101 01001011 01010010 01111100 11001000 01000000

00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000

00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000

00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000

00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000

01000000 00111110 00000000 00000000 00000000 00000000 00000000 00000000

01001101 00110010 00110001 01001111 01010100 01001111 01010010 01010000 "

我能夠重現數學,我認為,它進入了“1.000000”的領域。 數學是:+1 * 2^(1023-1023) * (1 + .0) = +1 * 2^0 * 1.0 = 1 * 1.0 = 1.000000

我無法重現我認為應該進入 30.000000 字段的數學:+1 * 2^(1027-1023) * (1 + .1970324836974592) = +1 * 2^4 * 1.1970324836974592 = 16 * 1.1970324836974592 = 19.152519739159347。

我試圖在 10-10000 范圍內的許多值上重現雙精度計算,而我的結果總是大約是該值的三分之二。

有人可以使用這些位串演示正確的計算,或者確認位串必須不正確嗎? (我無法理解它們是如何不正確的,因為使用這種字節提取,我在前面的標頭類中匹配了 9 個唯一的 8 或 16 個字符的 ASCII 字符串......

(這是我嘗試的第一個,即 2022 年:

2^(1033-1023) * (1 + .4389476917477114) = 1024 * 1.4389476917477114 = 1473.482436349656474

在這里,1473 相當於 2022 年的 3/4……)

謝謝

我不確定您為什么將它們轉換為二進制,但您所擁有的只是 8 字節雙精度浮點數。 您可以按原樣轉換它們。

bits = """\
01000000 10011111 10011000 00110100 10111100 01101010 01111110 11111010 
01000000 00011011 11111100 10111000 00001000 10111011 11101011 00010001
01000000 00101110 00101101 01001011 01010010 01111100 11001000 01000000
00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000
00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000
00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000
00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000
01000000 00111110 00000000 00000000 00000000 00000000 00000000 00000000
01001101 00110010 00110001 01001111 01010100 01001111 01010010 01010000"""

import struct

for line in bits.splitlines():
    by = bytes(reversed([int(k,2) for k in line.split()]))
    print(by)
    z = struct.unpack('d',by)[0]
    print(z)

輸出:

b'\xfa~j\xbc4\x98\x9f@'
2022.0515
b'\x11\xeb\xbb\x08\xb8\xfc\x1b@'
6.996795784444445
b'@\xc8|RK-.@'
15.088465287906843
b'\x00\x00\x00\x00\x00\x00\xf0?'
1.0
b'\x00\x00\x00\x00\x00\x00\xf0?'
1.0
b'\x00\x00\x00\x00\x00\x00\xf0?'
1.0
b'\x00\x00\x00\x00\x00\x00\xf0?'
1.0
b'\x00\x00\x00\x00\x00\x00>@'
30.0
b'PROTO12M'
7.484008430422714e+63

以下是您解開這些數字的方法。 讓我們看一下 30,即

403E000000000000
0100 0000 0011 1110 0000....

這里有三個字段:符號、指數、尾數:

0  100 0000 0011  1110 0000...
-- -------------  ------------
S  exponent       mantissa

符號位為正。 指數為 0x403,即指數為2**4 在“小數點”另一側的尾數左端有一個假定的“一位”,所以我們得到的分數是 1.111。 如果我們將它乘以2**4 ,我們得到 11110,即 30。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM