Какие-нибудь реальные процессоры не используют IEEE 754?
Я оптимизирую функцию сортировки для библиотеки числовых данных / статистики, исходя из предположения, что после фильтрации любых NaN и выполнения небольшого переворота числа с плавающей точкой можно сравнивать как 32-разрядные целые числа без изменения результата, а числа типа double можно сравнивать как 64-битные целые
Похоже, что это ускоряет сортировку этих массивов где-то на уровне порядка 40%, и я предполагаю, что до тех пор, пока представление чисел с плавающей запятой на битовом уровне соответствует IEEE 754. Существуют ли какие-либо реальные процессоры, которые люди фактически используют (исключая во встроенных устройствах, на которые эта библиотека не нацелена), которые используют какое-то другое представление, которое может нарушить это предположение?
- https://en.wikipedia.org/wiki/Single-precision_floating-point_format
(двоичный 32, он жеfloat
в системах, которые используют IEEE754) - https://en.wikipedia.org/wiki/Double-precision_floating-point_format
(двоичный 64, акаdouble
в системах, которые используют IEEE754)
4 ответа
Кроме дефектных Pentiums, любой процессор на базе x86 или x64 использует IEEE 754 в качестве своего арифметического стандарта с плавающей точкой.
Вот краткий обзор стандартов FPA и их принятия.
IEEE 754: Intel x86, and all RISC systems (IBM Power
and PowerPC, Compaq/DEC Alpha, HP PA-RISC,
Motorola 68xxx and 88xxx, SGI (MIPS) R-xxxx,
Sun SPARC, and others);
VAX: Compaq/DEC
IBM S/390: IBM (however, in 1998, IBM added an IEEE 754
option to S/390)
Cray: X-MP, Y-MP, C-90; other Cray models have been
based on Alpha and SPARC processors with
IEEE-754 arithmetic.
Если вы не планируете поддерживать свою библиотеку на довольно экзотических архитектурах процессоров, можно с уверенностью предположить, что на данный момент 99% процессоров соответствуют стандарту IEEE 754.
Это зависит от того, где вы проводите грань между "реальным миром" и воображаемым.
- Формат Vax G по-прежнему поддерживается на машинах Alpha (которые, по словам HP, будут поддерживаться как минимум в течение 2013 года).
- Шестнадцатеричная FP IBM все еще поддерживается мэйнфреймами IBM z-серии. Они добавили двоичную и десятичную поддержку IEEE, но, как я слышал, они редко используются, потому что шестнадцатеричная FP немного быстрее (IBM оптимизирует ее уже около 45 лет...)
До недавнего времени Unisys все еще продавал сервировки ClearPath IX, поддерживающие формат Burroughs FP, и машины ClearPath MCP, поддерживающие формат Univac FP. Я полагаю, что теперь они запускаются только в эмуляции (на Xeons), но с точки зрения программного обеспечения они, вероятно, будут продолжать активно использоваться еще десятилетие или более.
Даже несколько человек используют DtCyber для запуска Платона на (эмулируемых) мэйнфреймах Control Data с их уникальным форматом с плавающей запятой. (Извините, но мое первое серьезное программирование было на машине с CDC-кибер, поэтому я не мог удержаться от этого, даже если это не было "реальным миром" в течение десятилетий).
SPU в Cell Processor отличаются по нескольким причинам (например, отсутствие INF и NAN), но я не думаю, что различия могут нарушить ваши предположения...
Процессоры PowerPC (Macs до 2006-2007 гг., Тонны современных серверов IBM) используют 128-битный формат, состоящий из двух двойных для длинного двойного, вместо расширенного формата IEEE 754.
Однако в C или Objective-C нет переносимого способа интерпретировать 32-битное или 64-битное число с плавающей запятой как целое число (при условии, что float и uint32_t, или double и uint64_t имеют одинаковое количество битов). Когда мне нужно было делать подобные вещи, мне приходилось писать различный код в зависимости от компилятора (один использовал объединение, другой - приведение double* к long long*). Не знаю, будет ли реинтерпретация в C++ делать это переносимо.
Многие реальные процессоры не имеют никакого собственного формата с плавающей запятой. Многие реализации C и других языков для таких процессоров объединяют библиотеки, которые используют форматы IEEE-754 одинарной и двойной точности и опускают формат расширенной точности, несмотря на то, что другие форматы будут более подходящими для многих целей.