Подтвердить что ты не робот

Как использовать модуль для float/double?

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

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

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

4b9b3361

Ответ 2

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

От JLS §15.17.3:

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

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

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

Ответ 3

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

x = n / d
xint = Integer portion of x
result = n - d * xint

Ответ 4

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

int x = 5 % 3; // x = 2
double y = .5 % .3; // y = .2