LINUX.ORG.RU

История изменений

Исправление vodz, (текущая версия) :

В функциях с переменным числом аргументов float повышается до double,

Переменное число аргументов тут не при чём. При любом вызове «на стек» помещается удобное для этой архитектуры выровненное слово. Фиксированные аргументы с декларацией позволяют только автоматически явно расширить слово согласно декларации. printf по идее ничего не вычисляет, потому какой более больший тип будет использован внутри перед выводом на печать значения не имеет, имеет значение только формат вывода. Потому и родились расширения __attribute__((__format__(__printf__,1,2))), которые позволяют не расширить, а только предупредить, что %ld надо явно указать конвертацию, если в аргументах передали int, а указатель передаётся явно ошибочно. А использование %f — это не дань какой-то там экономии, а просто демострация, что для результата такая точность достаточна, например. если сами вычисления были не выше точности, чем float, используя скажем исходные данные в float-ах (вот тут уже экономия).

Исправление vodz, :

В функциях с переменным числом аргументов float повышается до double,

Переменное число аргументов тут не при чём. При любом вызове «на стек» помещается удобное для этой архитектуры выровненное слово. Фиксированные аргументы с декларацией позволяют только автоматически явно расширить слово согласно декларации. printf по идее ничего не вычисляет, потому какой тип будет использован внутри перед выводом на печать значения не имеет, имеет значение только формат вывода. Потому и родились расширения __attribute__((__format__(__printf__,1,2))), которые позволяют не расширить, а только предупредить, что %ld надо явно указать конвертацию, если в аргументах передали int, а указатель передаётся явно ошибочно. А использование %f — это не дань какой-то там экономии, а просто демострация, что для результата такая точность достаточна, например. если сами вычисления были не выше точности, чем float, используя скажем исходные данные в float-ах (вот тут уже экономия).

Исходная версия vodz, :

В функциях с переменным числом аргументов float повышается до double,

Переменное число аргументов тут не при чём. При любом вызове на стек помещается удобное для этой архитектуры выровненное слово. Фиксированные аргументы с декларацией позволяют только автоматически явно расширить слово согласно декларации. printf по идее ничего не вычисляет, потому какой тип будет использован внутри перед выводом на печать значения не имеет, имеет значение только формат вывода. Потому и родились расширения __attribute__((__format__(__printf__,1,2))), которые позволяют не расширить, а только предупредить, что %ld надо явно указать конвертацию, если в аргументах передали int, а указатель передаётся явно ошибочно. А использование %f — это не дань какой-то там экономии, а просто демострация, что для результата такая точность достаточна, например. если сами вычисления были не выше точности, чем float, используя скажем исходные данные в float-ах (вот тут уже экономия).