Является ли fmod () точным, когда y является целым числом?

При использовании double fmod(double x, double y) и y – целое число, результат оказывается всегда точным.

(Это y целое точное число, а не значение int здесь).

Возможно, C не требует, чтобы fmod() предоставлял точные ответы в этих случаях выбора, но в компиляторах, которые я пробовал, результат является точным, даже если частное от x/y не является точно представимым.

  1. Ожидаются ли точные ответы, когда y является целым числом?
  2. Если нет, укажите пример счетчика.

Примеры:

 double x = 1e10; // x = 10000000000 printf("%.50g\n", fmod(x, 100)); // prints 0 x = 1e60; // x = 999999999999999949387135297074018866963645011013410073083904 printf("%.50g\n", fmod(x, 100)); // prints 4 x = DBL_MAX; // x = 179769313486231570...6184124858368 printf("%.50g\n", fmod(x, 100)); // prints 68 x = 123400000000.0 / 9999; // x = 12341234.1234123408794403076171875 printf("%.50g %a\n", fmod(x, 100), fmod(x, 100)); // prints 34.1234123408794403076171875 0x1.10fcbf9cp+5 

Заметки:
Мой double отображается в соответствии с бинарным кодом IEEE 754.
Ограничения printf() здесь не рассматриваются, просто fmod() .


[Редактировать]

Примечание: «Точные ответы ожидаются», я спрашивал, является ли результат fmod() и математический результат одинаковым.

Стандарт IEEE 754 определяет операцию x REM y как математическую операцию x - (round(x/y)*y) . Результат является точным по определению, даже если промежуточные операции x/y , round(x/y) и т. Д. Имеют неточные представления.

Как указывается aka.nice, определение выше соответствует remainder библиотечной функции в libm . fmod определяется по-другому, требуя, чтобы результат имел тот же знак, что и x . Однако, поскольку разница между fmod и remainder равна 0 или y , я считаю, что это все еще объясняет, почему результат является точным.

Результат fmod всегда точен; является ли y целым, не имеет значения. Конечно, если x и / или y уже являются приближениями некоторых действительных чисел a и b , то fmod(x,y) вряд ли будет в точности равным a mod b .

  • Поймать Ctrl-C в C
  • Как «while (* s ++ = * t ++)» скопировать строку?
  • Получение имени каталога из имени файла
  • Преобразование int в строку в C
  • Ошибка с плавающей запятой в представлении?
  • Синхронизированный метод Java на объекте или методе?
  • Как обменяться между различными .c файлами?
  • Ошибка сегментации, восстанавливающая строковый литерал
  • Как числа с плавающей запятой сохраняются в памяти?
  • Присвоение отрицательных чисел неподписанному int?
  • Как отсортировать массив структур в C?
  • Interesting Posts

    Магистраль: обновить один и тот же маршрут маршрута в два раза

    Являются ли HLists не более чем сложным способом написания кортежей?

    API REST. Лучшие практики. Где указать параметры?

    Дроссельная скорость загрузки нового маршрутизатора с Comcast (ipv6 vs ipv4)

    Как приостановить план обслуживания приложений Azure?

    Арифметический сдвиг вправо дает фиктивный результат?

    Как имитировать буферизованное периферийное устройство с SwingWorker?

    Двойной экран ПК понижен до одного экрана, программы работают на втором экране

    Может ли MySQL FIND_IN_SET или эквивалент использовать индексы?

    Может ли медиа-запрос изменять размер на основе элемента div вместо экрана?

    Outlook 2010 не разрешает поиск папок IMAP

    Разбор аргументов командной строки в сценариях R

    Можно ли сериализовать и десериализовать class в C ++?

    Перемещение пользовательских папок в Mac OS X?

    Как проверить правильность строки подключения?

    Давайте будем гением компьютера.