Вот эскиз интересной «портативной» реализации.Он не обрабатывает ни одного из интересных краевых случаев, таких как целые числа, NaN, бесконечности или даже отрицательные числа, потому что я ленив, но расширить его не будет так сложно.
(my $bin = sprintf "%b.%032b", int($num), 2**32 * ($num - int($num)))
=~ s/\.?0+$//;
** 32 похоже на магическое число для конкретной архитектуры, но на самом деле это просто то, сколько бит точности вы хотите после точки.Слишком маленький, и вы получите безобидное усечение;слишком велик и может привести к переполнению (поскольку %b
, вероятно, когда-нибудь преобразуется в UV перед выполнением его форматирования).