Как работает директива с плавающей запятой в упаковке ()/распаковке () Ruby?

Может ли кто-нибудь здесь помочь мне понять, как приведенные ниже директивы с плавающей запятой работают в Ruby с методом packing() and unpacking()?

  • D and d
  • F and f
  • g and G
  • e and E

Я пробовал ниже:

irb(main):001:0> [2,44,43].pack('D')
=> "\x00\x00\x00\x00\x00\x00\x00@"
irb(main):002:0> [2,44,43].pack('d')
=> "\x00\x00\x00\x00\x00\x00\x00@"
irb(main):004:0> [2,44,43].pack('ddd')
=> "\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00F@\x00\x00\x00\x00\x00\
x80E@"
irb(main):005:0> [2,44,43].pack('fff')
=> "\x00\x00\x00@\x00\x000B\x00\x00,B"
irb(main):006:0> [2,44,43].pack('FFF')
=> "\x00\x00\x00@\x00\x000B\x00\x00,B"
irb(main):007:0> [2,44,43].pack('ggg')
=> "@\x00\x00\x00B0\x00\x00B,\x00\x00"
irb(main):008:0> [2,44,43].pack('GGG')
=> "@\x00\x00\x00\x00\x00\x00\x00@F\x00\x00\x00\x00\x00\x00@E\x80\x00\x00\x00\x0
0\x00"
irb(main):009:0>

Как идет выход? какова логика таких вычислений?

Заранее спасибо!


person Arup Rakshit    schedule 12.01.2013    source источник
comment
Какая часть документации у вас есть? проблемы с?   -  person mu is too short    schedule 12.01.2013
comment
Да, там просто показали часть директив с примерами, а не весь мой список. Итак, как новичок на этой платформе ruby, я хотел бы действительно знать, как именно они работают, какая логика с ними связана?   -  person Arup Rakshit    schedule 12.01.2013
comment
Пробовали ли вы использовать их в сочетании с шестигранным дампером? Они работают так же, как в Python и Perl: они преобразуют нативные типы в необработанные биты и обратно.   -  person mu is too short    schedule 12.01.2013
comment
Не могли бы вы помочь мне с некоторыми крошечными кодами. Я тоже не знаком с Perl или Python. Ваша помощь может стать хорошим началом для дальнейшего изучения с ними!   -  person Arup Rakshit    schedule 12.01.2013
comment
Почему бы вам не попробовать это в irb? Большинство людей, которых вы спрашиваете, тоже не знают, как это работает. Хитрость в том, чтобы проверить их с помощью irb. Так что вы пробовали, и что конкретно вам не понятно в этих методах? Ваш вопрос имеет слишком широкий охват.   -  person Casper    schedule 12.01.2013
comment
Не закрывайте этот пост, я только что обновил описание! надеюсь, люди вокруг SO теперь поймут, что я пытаюсь понять! пожалуйста, не голосуйте пост за закрытие!   -  person Arup Rakshit    schedule 12.01.2013
comment
Что плохого в том, что люди проголосовали против? если есть какие-либо проблемы, чтобы понять, что я ищу здесь, пожалуйста, спросите меня. не пробовать вредную привычку DOWN VOTE.   -  person Arup Rakshit    schedule 12.01.2013
comment
Кратко: у чисел с плавающей запятой есть двоичное представление, понятное компьютеру, C и C++, и другое представление, понятное Ruby; pack и unpack используются для преобразования между этими двумя. Обычно они используются для чтения/записи двоичных файлов и передачи двоичных сетевых протоколов.   -  person mu is too short    schedule 13.01.2013


Ответы (1)


Эти директивы преобразуют числа в массиве в байтовое представление с плавающей запятой.

Если вы хотите узнать, что происходит, вы можете посмотреть это видео:

Представление с плавающей запятой: пример
https://www.youtube.com/watch?v=t-8fMtUNX1A

И прочитайте эту статью:
http://www.geeksforgeeks.org/floating-point-representation-basics/

Через Google я нашел для вас приведенные выше ответы, выполнив поиск "представление с плавающей запятой"< /а>.


Просто для примера:

> [2.0].pack('f').bytes.map(&:to_i)
=> [0, 0, 0, 64]

Это число с плавающей запятой, представленное в шестнадцатеричном виде как:

0x40000000

Где вы можете видеть, что 64 равно 0x40 в шестнадцатеричном формате.

Чтобы понять, почему 2.0 становится 0x40000000, вы должны понимать, как компьютеры преобразуют числа с плавающей запятой в двоичные представления.

Вы можете использовать эту страницу для тестирования:
http://www.h-schmidt.net/FloatConverter/IEEE754.html

Например, вот как это выглядит для 2.0:

http://i.imgur.com/qWqFM.png

person Casper    schedule 12.01.2013
comment
Нет, я даю вам один пост, посмотрите, как кто-то ответил на этот пост. и я не нашел ответов на свой пост выше, поэтому опубликовал. посмотрите объяснение. Пожалуйста, не голосуйте за меня! пост. - person Arup Rakshit; 12.01.2013
comment
@PythonLikeYOU Я прочитал этот ответ. На это нельзя ответить так просто. Пожалуйста, посмотрите видео (10 минут), и вы увидите, что это не так просто. - person Casper; 12.01.2013
comment
хорошо! тогда пусть он откроется, надеюсь, что кто-нибудь обязательно ответит здесь, не голосуйте против, это сделало мой пост плохим для просмотра! Кстати, я смотрю видео! - person Arup Rakshit; 13.01.2013
comment
@PythonLikeYOU - Посмотрите видео, а затем посмотрите мой отредактированный ответ. - person Casper; 13.01.2013