Как использовать модуль для float / double? - PullRequest
44 голосов
/ 01 июня 2010

Я создаю калькулятор RPN для школьного проекта. У меня проблемы с оператором модуля. Поскольку мы используем тип данных double, модуль не будет работать с числами с плавающей запятой. Например, 0,5% 0,3 должно возвращать 0,2, но я получаю деление на ноль исключений.

Инструкция говорит использовать fmod (). Я везде искал fmod (), включая javadocs, но не могу его найти. Я начинаю думать, что это метод, который я собираюсь создать?

редактировать: хм, странно. Я просто снова подключил эти цифры, и, кажется, все работает нормально ... но на всякий случай. Нужно ли следить за использованием оператора mod в Java при использовании плавающих типов? Я знаю, что подобное не может быть сделано в C ++ (я думаю).

Ответы [ 4 ]

64 голосов
/ 01 июня 2010

Вероятно, у вас была опечатка при первом запуске.

оценка 0.5 % 0.3 возвращает '0,2' (двойное значение), как и ожидалось.

Mindprod имеет хороший обзор того, как работает модуль в Java.

41 голосов
/ 01 июня 2010

В отличие от C, Java позволяет использовать% как для целых чисел, так и для чисел с плавающей запятой, и (в отличие от C89 и C ++) он четко определен для всех входных данных (включая отрицательные):

С JLS §15.17.3 :

Результат с плавающей точкой Остальная операция определяется правила IEEE арифметики:

  • Если любой из операндов равен NaN, результат равен NaN.
  • Если результат не NaN, знак результата равен знаку дивиденд.
  • Если дивиденд - это бесконечность, или делитель - ноль, или оба, результат - NaN.
  • Если дивиденд конечен, а делитель бесконечен, результат равняется дивиденду.
  • Если дивиденд равен нулю, а делитель конечен, результат равняется дивиденду.
  • В остальных случаях, когда ни бесконечность, ни ноль, ни NaN участвует, с плавающей точкой остаток от деления дивиденд n делителем d определяется по математическому соотношению r = n- (d · q) где q - целое число, которое отрицательно только если н / д отрицательный и положительный только если н / д положительный, и чей Величина как можно больше без превышения величины истинное математическое отношение n и d.

Так что для вашего примера 0,5 / 0,3 = 1,6 .... q имеет тот же знак (положительный), что и 0,5 (дивиденд), и величина равна 1 (целое число с наибольшей величиной, не превышающей величину 1,6 ...), а r = 0,5 - (0,3 * 1) = 0,2

6 голосов
/ 01 июня 2010

Я думал, что обычный оператор модуля будет работать для этого в Java, но это не сложно написать Просто разделите числитель на знаменатель и возьмите целую часть результата. Умножьте это на знаменатель и вычтите результат из числителя.

x = n / d
xint = Integer portion of x
result = n - d * xint
3 голосов
/ 01 июня 2010

fmod - стандартная функция C для обработки модуля с плавающей точкой; Я полагаю, ваш источник говорил, что Java обрабатывает модуль с плавающей точкой так же, как и функция C fmod. В Java вы можете использовать оператор % для двойных чисел так же, как для целых чисел:

int x = 5 % 3; // x = 2
double y = .5 % .3; // y = .2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...