Реально ли натуральное число? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть 2 действительных числа (например, a, b). Есть ли способ узнать, является ли результат их деления натуральным числом? Я пытался

a mod b  {to check if the result is 0}

но "мод" не работает для реальных чисел. Также

a/b-trunc(a/b) {but sometimes the answer isn't 0}

Я новичок, пожалуйста, есть ли другой способ, дайте мне знать.

1 Ответ

0 голосов
/ 18 мая 2018

Использование Frac может быть одной идеей, как упоминает @Sertac. Но поскольку двоичная с плавающей запятой не представляет все действительные числа, могут быть случаи, когда дробь может также оказаться близкой к нулю (или к одному).

Вот простая процедура, которая позволяет избежать тестирования на близкие к нулю значения:

function IsNaturalNumber( value : Double) : Boolean;
const
  epsilon : Double = 1E-12;
begin
  IsNaturalNumber := Abs(value - Round(value)) < epsilon;
end;

var
  A,B : Double;
begin
  A := 3.3;
  B := 1.1;
  WriteLn(IsNaturalNumber(A/B));  // Writes TRUE
end.

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

Обратите внимание, что абсолютной уверенности нет. Это потребует использования десятичной арифметической библиотеки с плавающей запятой.


Я предоставлю заинтересованному читателю возможность реализовать исключение целых чисел, выходящих за пределы диапазона натуральных чисел, независимо от того, являются ли они отрицательными числами, включая ноль, или нет.


Если значения для проверки больше, чем верхний диапазон функции Round(), используйте эквивалентную функцию с плавающей запятой. В Delphi это Math.RoundTo(value,0).

...