Как преобразовать число с плавающей точкой в ​​двоичную строку и наоборот с Ruby? - PullRequest
1 голос
/ 20 сентября 2011

Я хотел бы знать, как лучше всего преобразовать число с плавающей точкой в ​​двоичную строку и наоборот, из двоичной строки в число с плавающей точкой.

Я работаю с генетическими алгоритмами и мне нужно сохранить двоичное представлениечисла с плавающей точкой в ​​диапазоне [0-1], поэтому дополнительно мне нужно знать количество бит, которые Ruby использует для сохранения числа с плавающей точкой в ​​памяти.

Я пытаюсь решить эту проблему с помощью String# Распаковываю метод, но получаю странный результат:

binary_string_number = "0" * 32
=> "00000000000000000000000000000000" 
binary_string_number.unpack("F")
=> [6.409690556097303e-10]

Результат должен быть 0,0, верно? Я не понимаю этого поведения.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

Я думаю, что вам нужно упаковать вашу строку, прежде чем пытаться распаковать ее во Float То, что у вас есть, это в основном строка, представляющая последовательность битов, но не фактические биты, которые вы пытаетесь прочитать (если я правильно понимаю ваш вопрос).

["0" * 32].pack("b*")                        # => "\x00"
["0" * 32].pack("b*").unpack("F")            # => "\x00".unpack("F") => 0.0
["11".rjust(32, "0")].pack("b*").unpack("F") # => -2.0

Однако я не очень разбираюсь в этом.

1 голос
/ 20 сентября 2011

"0" на самом деле ASCII 48, поэтому ваша строка на самом деле является массивом 48 с.

Что вы, вероятно, хотели сделать:

binary_string_number = "\0" * 32

Таким образом, вы получите массивнули, которые при распаковке преобразуются в 0.0

...