Любая двоичная с плавающей точкой может быть отформатирована точно в десятичном формате. Результирующая строка может быть несколько длинной, но это возможно. В моей статье о плавающей запятой я рассказываю о важности точности, и теперь я хочу эту функцию. Эта задача состоит в том, чтобы написать программу или функцию, которая принимает значение с плавающей запятой в качестве входных данных и форматирует точную десятичную строку в качестве выходных данных.
Чтобы убедиться, что мы работаем с правильными числами с плавающей запятой, в качестве входных данных для программы должен быть указан точный формат. Этот формат будет двумя целыми числами Significand Exponent
, где фактическое значение с плавающей запятой равно Significand * 2 ^ Exponent
. Обратите внимание, что любое значение может быть отрицательным.
Особенности:
- Диапазон и точность не менее 32-разрядного числа с плавающей запятой должны поддерживаться (никакие входные данные не выходят за пределы этого)
- Значение в десятичном формате должно быть точным представлением (достаточно близко, чтобы гарантировать, что правильное закругление назад для плавания не достаточно хорошо)
- Мы не верим, что стандартные функции форматирования с плавающей запятой являются достаточно правильными и достаточно быстрыми (например,
printf
), и поэтому они могут не использоваться. Вы должны сделать форматирование. Встроенные функции форматирования / преобразования разрешены. - Не может быть никаких начальных или конечных нулей, за исключением обязательного начального нуля перед компонентом,
.
если нет целого числа - Разрешена функция или целая программа.
Примеры:
1 -2 => 0.25
17 -3 => 2.125
-123 11 => -251904
17 50 => 19140298416324608
23 -13 => 0.0028076171875
3 120 => 3987683987354747618711421180841033728
3 -50 => 0.00000000000000266453525910037569701671600341796875
-3 -50 => -0.00000000000000266453525910037569701671600341796875
10 -2 => 2.5
-12345 -3 => -1543.125
0 0 => 0
161 -4 => 10.0625
512 -3 => 64
Самый короткий код выигрывает.
источник
.0
?0.abc
не ведущий ноль, тоabc.0
не конечный..0
целыми числами при работе с числами с плавающей запятой. Смотрите, например, Python:str(1.0) == '1.0'
противstr(1) == '1'
. Ваша логика все еще противоречива.Ответы:
CJam, 43
Попробуйте онлайн
Объяснение:
Программа работает с показателями до ± 999, близкими к двойной точности (64 бита). Он отделяет знак минус (если имеется) от значения и умножает его на 10 999, затем выполняет сдвиг в битах с показателем степени, который теперь является точным вычислением. Затем она дополняется нулями, если результат содержит менее 1000 цифр, отделяет последние 999 цифр как дробную часть, удаляет завершающие нули путем преобразования обратного числа в целое, добавляет десятичную точку, если необходимо, и собирает все обратно.
В конце знак минус (если есть) и итоговая строка автоматически печатаются вместе.
источник
CJam, 50 байтов
Это полная программа, которая читает из STDIN. Попробуйте онлайн в интерпретаторе CJam .
Проверьте все тестовые случаи одновременно.
источник
GNU sed + dc, 65
Оценка включает +1 для
-r
варианта Sed .Я испытал иск, чтобы требовать этого
dc
- только ответC8k& 2r^*p
на счет 10, ноdc
есть некоторые особенности форматирования:_
вместо-
|n| < 1
должен быть добавлен начальный 0 дляТаким образом, выражение dc обернуто и удалено,
sed
чтобы позаботиться о вышеперечисленном.Тестовый вывод:
источник
dc
это нарушает мое правило использования стандартной функции форматирования.dc
порядке, учитывая, что «допускается арифметика с неограниченной или высокой фиксированной точностью» .dc
«Sp
команда не является„ плавающей точкой функции форматирования“ - это произвольная функция точность печати. Я устанавливаю точность до 128 знаков после запятой (C8k
), что, я думаю, более чем достаточно для любого 32-разрядного числа с плавающей запятой.