История изменений
Исправление i-rinat, (текущая версия) :
Как видим, в стеке независимо от декларации float помещаются float-ы со смещением double с обнуленной частью для gcc 4.8.2 (и не обнулённой для gcc 4.2.3).
Я не могу понять, ты идиот или просто прикидываешься?
В x86-64 ABI числа с плавающей точкой передаются в отдельных регистрах SSE. При передаче ты заполняешь первые 32 бита. Остальная часть регистра обычно будет содержать мусор, но при старте там будут нули. Вызываемая функция интерпретирует это как double. Видишь, у тебя код печатает pi=0.000000
, хотя ты передавал M_PI? Там на самом деле не ноль, а просто маленькое число получилось (5.3286462644e-315), которого не видно при печати числа с фиксированной позицией запятой. Там нет преобразования в double, как ты пытаешься показать. Данные записываются «как есть», а потом читаются «как есть».
Более того, так как целочисленные параметры передаются в регистрах общего назначения, а параметры с плавающей точкой — в SSE регистрах, можно в некоторых пределах поменять порядок параметров, и работать будет точно так же. Попробуй, например, в xlib.c поменять так:
double dirty_sin(unsigned int start, unsigned int end, double pi, double d2)
В i386 ABI параметры с плавающей точкой пушатся в стек. И там будет месиво, когда вызываемая функция попытается прочитать из стека не то, что она там ожидает.
Потому что обнулять ли вторую половину или оставлять там мусор потому что мы явно определили, что работаем с одинарной точностью определяется компилятором и стандарта на это нет.
Это просто бред. Отсюда можно попытаться вычленить разумные утверждения, но всё это вместе связано в бредовое восприятие мира. Причём со святой уверенностью в своей правоте. Что ж, видимо, 35 лет программирования не проходят бесследно.
Исходная версия i-rinat, :
Как видим, в стеке независимо от декларации float помещаются float-ы со смещением double с обнуленной частью для gcc 4.8.2 (и не обнулённой для gcc 4.2.3).
Я не могу понять, ты идиот или просто прикидываешься?
В x86-64 ABI числа с плавающей точкой передаются в отдельных регистрах SSE. При передаче ты заполняешь первые 32 бита. Остальная часть регистра обычно будет содержать мусор, но при старте там будут нули. Вызываемая функция интерпретирует это как double. Видишь, у тебя код печатает pi=0.000000
, хотя ты передавал M_PI? Там на самом деле не ноль, а просто маленькое число получилось (5.3286462644e-315), которого не видно при печати числа с фиксированной позицией запятой. Там нет преобразования в double, как ты пытаешься показать. Данные записываются «как есть», а потом читаются «как есть».
Более того, так как целочисленные параметры передаются в регистрах общего назначения, а параметры с плавающей точкой — в SSE регистрах, можно в некоторых пределах поменять порядок параметров, и работать будет точно так же. Попробуй, например, в xlib.c поменять так:
double dirty_sin(unsigned int start, unsigned int end, double pi, double d2)
В i386 ABI параметры с плавающей точкой пушатся в стек. И там будет месиво, когда вызываемая функция попытается прочитать из стека не то, что она там ожидает.
Потому что обнулять ли вторую половину или оставлять там мусор потому что мы явно определили, что работаем с одинарной точностью определяется компилятором и стандарта на это нет.
Это просто бред.