В другом вопросе кто-то задавался вопросом, почему они получают "ошибку с плавающей запятой", когда на самом деле у них было целочисленное деление на ноль в их программе на C++. Вокруг этого возникло обсуждение, причем некоторые утверждают, что исключения с плавающей запятой на самом деле никогда не поднимаются для деления на float на ноль, а возникают только при делении целых чисел на ноль.
Это звучит странно для меня, потому что я знаю, что:
-
Скомпилированный код MSVC на x86 и x64 на всех платформах Windows сообщает, что int делит на ноль как "0xc0000094: целочисленное деление на ноль", а float делит на ноль как 0xC000008E "Деление с плавающей запятой на ноль" ( если включено)
-
IA-32 и AMD64 ISAs указать
#DE
(исключение целочисленного деления) в качестве прерывания 0. Исключения с плавающей запятой включают прерывание 16 (плавающая точка x87) или прерывание 19 (плавающая точка SIMD). -
Другие аппаратные средства имеют аналогичные разные прерывания (например, PPC повышает 0x7000 на float-div-by-zero и вообще не ловушка для int/0).
-
Наше приложение исключает исключения с плавающей запятой для деления на ноль с внутренним (timate >
stmxcsr
op)_controlfp_s
, а затем захватывает их для целей отладки. Таким образом, я определенно видел исключения IEEE754 на основе исключения на нуль на практике.
Итак, я пришел к выводу, что есть некоторые платформы, которые сообщают об исключениях в качестве исключений с плавающей запятой, таких как x64 Linux (повышение SIGFPE для всех арифметических ошибок независимо от канала ALU),
Какие другие операционные системы (или время выполнения C/С++, если вы являетесь операционной системой), представляют целое число div-by-zero как исключение с плавающей запятой?