readBin не дает ожидаемого результата

Мне нужно преобразовать формат IEEE-754 в число с плавающей запятой двойной точности.

Согласно https://babbage.cs.qc.cuny.edu/IEEE-754.old/64bit.html шестнадцатеричное представление 400921fb54442d18 должно быть примерно пи, 3,1415...

Однако:

> readBin(as.raw(c(0x40, 0x09, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18)), 'double')
[1] 3.207376e-192

Как получить число пи из 400921fb54442d18 в R?


person madsurgeon    schedule 07.09.2020    source источник


Ответы (1)


При чтении многобайтовых чисел необходимо помнить о порядке следования байтов, который определяет порядок байтов. Это необработанное значение имеет формат с обратным порядком байтов, который не должен использоваться по умолчанию в вашей системе. Пытаться

readBin(as.raw(c(0x40, 0x09, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18)), 'double', endian="big")
# [1] 3.141593

В формате с прямым порядком байтов эти байты будут просто перевернуты. Таким образом, вы также можете сделать

# assuming .Platform$endian returns "little" (system default)
readBin(rev(as.raw(c(0x40, 0x09, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18))), 'double')
person MrFlick    schedule 07.09.2020