Фон
IEEE 754 Формат с плавающей запятой двойной точности представляет собой способ представления действительных чисел с помощью 64-разрядных. Это выглядит следующим образом:
Действительное число n
преобразуется в a double
следующим образом:
- Знаковый бит
s
равен 0, если число положительное, и 1 в противном случае. - Абсолютное значение
n
представляется в виде2**y * 1.xxx
, то есть степень -2, умноженная на основание . - Показатель
e
являетсяy
(сила 2) минус 1023. - Фракция
f
- этоxxx
часть (дробная часть базы), занимающая самые значимые 52 бита.
Наоборот, битовая комбинация (определенная знаком s
, показателем степени e
и дробью f
, каждое целое число) представляет число:
(s ? -1 : 1) * 2 ** (e - 1023) * (1 + f / (2 ** 52))
Вызов
Учитывая действительное число n
, выведите его 52-битную дробную часть double
представления n
в виде целого числа.
Тестовые случаи
0.0 => 0
1.2 => 900719925474099 (hex 3333333333333)
3.1 => 2476979795053773 (hex 8cccccccccccd)
3.5 => 3377699720527872 (hex c000000000000)
10.0 => 1125899906842624 (hex 4000000000000)
1234567.0 => 798825262350336 (hex 2d68700000000)
1e-256 => 2258570371166019 (hex 8062864ac6f43)
1e+256 => 1495187628212028 (hex 54fdd7f73bf3c)
-0.0 => 0
-1.2 => 900719925474099 (hex 3333333333333)
-3.1 => 2476979795053773 (hex 8cccccccccccd)
-3.5 => 3377699720527872 (hex c000000000000)
-10.0 => 1125899906842624 (hex 4000000000000)
-1234567.0 => 798825262350336 (hex 2d68700000000)
-1e-256 => 2258570371166019 (hex 8062864ac6f43)
-1e+256 => 1495187628212028 (hex 54fdd7f73bf3c)
Вы можете проверить другие числа, используя эту ссылку C, которая использует битовые поля и объединение.
Обратите внимание , что ожидаемый ответ одинаков для +n
и -n
для любого числа n
.
Вход и выход
Стандартные правила применяются.
Принятый формат ввода:
- Число с плавающей запятой, по крайней мере, имеющее
double
внутреннюю точность - Строковое представление числа в десятичном виде (вам не нужно поддерживать научную запись, так как вы можете использовать
1000...00
или в0.0000...01
качестве ввода)
Для вывода допустима ошибка округления младшего бита.
Условие победы
Это код-гольф , поэтому побеждают младшие байты на каждом языке.
Ответы:
C (gcc) ,
4230 байтПринимает указатель на double в качестве аргумента и возвращает long .
Требует 64-битных длинных и gcc (неопределенное поведение).
Спасибо @nwellnhof за -2 байта!
Попробуйте онлайн!
источник
&~0UL>>12
на два байта короче. Макрос работает только с lvalues.-Df(x)=*(long *)&x&~0UL>>12
, сохраните 3 байта. TIOHaskell,
2731 байтdecodeFloat
возвращает значение и показатель степени, но по какой-то причине в Хаскелле первое составляет 53 бита , поэтому мы должны обрезать один бит.Попробуйте онлайн!
источник
Python 3 ,
5450 байтПопробуйте онлайн!
С предложением Кирилла:
Попробуйте онлайн!
источник
hex()
дает нормализованную запись, которая всегда начинается с0x1.
. Если это так, вы можете просто использовать это для 44 байтов.машинный язык x86_64 для Linux, 14 байтов
Попробуйте онлайн!
источник
MATL , 10 байт
Попробуйте онлайн!
объяснение
источник
JavaScript (ES7),
5250 байтНе используется,
Math.floor(Math.log2(n))
потому что это не гарантируется, чтобы быть точным. Изменить: Сохранено 2 байта благодаря @DanielIndie.источник
Perl 5
-pl
, 28 байтПопробуйте онлайн!
Тестовые случаи 1e-256 и 1e256 отключены, но это потому, что Perl 5 преобразует огромные или крошечные строки с плавающей запятой неточно.
источник
Макрос C (gcc) , 49 байтов
Попробуйте онлайн!
Возвращает,
double
но при условии точности IEEE, он не будет иметь дробной части. Также обрабатывает отрицательные числа сейчас.источник
T-SQL , 80 байт
Входные данные взяты из столбца
n
таблицы с именемt
:SQLFiddle
источник
Хун , 25 байт
Создайте универсальную функцию, которая возвращает мод ввода
2^52
.Называя это:
источник
JavaScript (ES7),
9876 байтСохранено 22 (!) Байта благодаря @Neil
Более подробный, чем ответ Нейла , но я хотел попробовать его с типизированными массивами .
Попробуйте онлайн!
источник
UInt32Array
сохраняет 22 байта:(n,[l,h]=new Uint32Array(new Float64Array([n]).buffer))=>(h&-1>>>12)*2**32+l
BigInt64Array
?APL (Dyalog) , 38 байт
Попробуйте онлайн!
источник
Stax ,
1914 байтовЗапустите и отладьте его
Распакованный, распакованный и прокомментированный код выглядит следующим образом.
Запустите этот
источник
Рубин , 39 байт
Попробуйте онлайн!
источник
Ржавчина , 21 байт
Довольно много скопированного C-решения. Принимает
f64
аргумент.Попробуйте онлайн!
источник
Java 8 или более поздняя , 38 байт
Попробуйте онлайн!
источник
Машинный язык Aarch64 для Linux, 12 байт
Чтобы попробовать это, скомпилируйте и запустите следующую C-программу на любом компьютере Aarch64 Linux или (Aarch64) Android-устройстве под управлением Termux
источник
Юлия 0,4 , 30 байт
Попробуйте онлайн!
источник
Forth (gforth) , 42 байта
Предполагается, что число с плавающей запятой по умолчанию удваивается, а ячейки имеют длину 8 байт (как в случае с моим компьютером и TIO)
Попробуйте онлайн!
объяснение
Forth (gforth) 4-байтовый ответ ячейки, 40 байтов
В некоторых старых установках по умолчанию вместо 4-байтовых ячеек используются
объяснение
источник