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

Проблема в вашем текущем коде заключается в том, что в вашем вызове shark есть лишняя пара скобок. Это приводило к тому, что ваш код пытался разделить (12, 50, 4, 8, true) на undefined (потому что это был единственный переданный аргумент, а youSpeed не существовало. Удаление их решит вашу проблему:

]
function shark(pontoonDistance, sharkDistance, youSpeed, sharkSpeed, dolphin) {

let yourRate = pontoonDistance / youSpeed;

return yourRate;

}
console.log(shark(12, 50, 4, 8, true));

7
задан Jeffrey 1 October 2008 в 15:10
поделиться

1 ответ

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

Возвращаемое значение

Число, равное x - (y Q), где Q является частным x / y округленный к ближайшему целому числу (если x / y падения на полпути между двумя целыми числами, ровное целое число возвращается).

Так: 3 - (2 * (вокруг (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) при применении к аргументам с плавающей точкой походит на оператор остатка при применении к целочисленным аргументам. Таким образом, тот же математический formula1 используется (с дополнительными соображениями для угловых случаев, связанных с представлениями с плавающей точкой) и в целочисленных и в операциях остатка с плавающей точкой.

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

  1. Данный: z = x % y, затем z = x - (x / y) * y
8
ответ дан 7 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: