Math.IEEERemainder возвращает отрицательные результаты. Почему?

Инфраструктура .net включает Math.IEEERemainder (x, y) в дополнение к стандартному оператору модификации. Что на самом деле делает эта функция? Я не понимаю отрицательных чисел, которые это дает.

Пример:

Math.IEEERemainder(0, 2) = 0
Math.IEEERemainder(1, 2) = 1
Math.IEEERemainder(2, 2) = 0
Math.IEEERemainder(3, 2) = -1
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
3 538
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы прочитаете пример, приведенный в Страница MSDN System.Math.IEEERemainder, вы заметите, что два положительных числа могут иметь отрицательный остаток.

Return Value

A number equal to x - (y Q), where Q is the quotient of x / y rounded to the nearest integer (if x / y falls halfway between two integers, the even integer is returned).

Итак: 3 - (2 * (round (3/2))) = -1

/*
...
Divide two double-precision floating-point values:
1) The IEEE remainder of 1.797693e+308/2.00 is 0.000000e+000
2) The IEEE remainder of 1.797693e+308/3.00 is -1.000000e+000
Note that two positive numbers can yield a negative remainder.

*/

Эпилог

Фактический вопрос может быть таким: «Почему у нас есть две операции с остатком?» Когда имеешь дело с данные с плавающей запятой, вы всегда должны быть осведомлены о своем стандарте с плавающей запятой. Поскольку мы живем в 21 веке, почти все работает на IEEE 754, и очень немногие из нас беспокоятся о том, чтобы, скажем, VAX F_Float или IEEE 754.

Стандарт C# утверждает, что оператор остатка (раздел 7.7.3), когда он применяется к аргументам с плавающей запятой, аналогичен оператору остатка, когда применяется к целочисленным аргументам. То есть одна и та же математическая формула 1 используется (с дополнительными соображениями для угловых случаев, связанных с представлениями с плавающей запятой) как в операциях с целыми числами, так и в операциях с остатками с плавающей запятой.

Следовательно, если вы хотите, чтобы ваши операции с остатком для чисел с плавающей запятой соответствовали вашим текущим режимам округления IEEE 754, рекомендуется использовать Math.IEEERemainder. Однако, если ваше использование не особенно чувствительно к тонкой разнице в округлении, производимой оператором остатка C#, продолжайте использовать этот оператор.

  1. Дано: z = x% y, тогда z = x - (x / y) * y

Это именно то, что я как раз собирался опубликовать. Уберись из моей головы. ;)

Jeff Yates 01.10.2008 19:20

@ffpf: ха-ха, интересно было бы, зачем вам Modulo и IEEERemainder. Можете обыграть меня, добавив это, если хотите: D

user7116 01.10.2008 19:22

@sixlettervariables: Нет, я не спрашиваю. Боюсь ответа.

Jeff Yates 01.10.2008 19:28

@ffpf: наслаждайтесь ответом, это не потрясающе.

user7116 01.10.2008 19:31

Режимы округления IEEE 754 не влияют ни на операцию IEEERemainder, ни на операцию %, потому что оба они точны. Точность означает, что результат будет одинаковым независимо от режима округления. Что между ними различается, так это лежащее в основе понятие интегрального частного. IEEERemainder округляет математическое частное до ближайшего целого числа, чтобы получить q в x - q * y.

Pascal Cuoq 13.01.2016 17:38

Вы говорите «почти все на IEEE 754», но я не понимаю, насколько это актуально, поскольку вопрос в том, почему C# (и большинство других языков) явно НЕ реализуют IEEE 754 для оператора модуля.

BlueRaja - Danny Pflughoeft 07.06.2017 19:48

Другие вопросы по теме