Если реализация соответствует Приложению G и реализует типы _Imaginary
, то выражение
b = 0.0 + (__extension__ -0.0iF)
оценивается как (double)0.0 + (double _Imaginary)(-0.0i)
в соответствии с правилами в G.5.2 и дает 0.0 - 0.0i
.
Если реализация не предоставляет тип _Imaginary
(что разрешено) или иным образом не соответствует Приложению G (также разрешено), то это выражение обычно оценивается как:
(double _Complex)(0.0 + 0.0i) + (double _complex)(0.0 - 0.0i)
= (double _Complex)((0.0 + 0.0) + (0.0 - 0.0)i)
Поскольку 0.0 - 0.0
равно положительно ноль при округлении по умолчанию IEEE-754, знаковый бит теряется.
Мораль истории: если вам небезразличен знак нуля, донаНе использую арифметику в сложных инициализаторах.Поскольку вы используете GCC, вы можете сделать это вместо этого:
__real__ c = 0.0f;
__imag__ c = -0.0f;
По моему опыту, это работает, по крайней мере, до gcc-4.0 или около того (возможно, дальше).
Что касаетсяпочему поведение было вызвано -std=c99
, мое лучшее предположение следующее: используемая вами версия GCC реализует тип _Imaginary
, который не полностью совместим с C99;когда вы указываете -std=c99
, поддержка _Imaginary
отключается, и вы возвращаетесь к согласованной реализации _Complex
, которая работает, как я описал выше.Это только предположение однако;если вам действительно интересно, я бы посоветовал вам сообщить об ошибке и посмотреть, что говорят сопровождающие.На самом деле, я бы посоветовал вам сообщить об ошибке в любом случае. Всегда сообщайте об ошибке .