实数是自然数吗?
Is real number natural?
我有 2 个实数(例如 a、b)。有什么办法可以知道他们除法的结果是不是自然数?
我试过了
a mod b {to check if the result is 0}
但 "mod" 不适用于实数。
还有
a/b-trunc(a/b) {but sometimes the answer isn't 0}
我是初学者,请问有没有其他方法,请告诉我。
使用 Frac
可能是@Sertac 提到的一种想法。但由于二进制浮点数并不代表所有实数,因此在某些情况下分数可能最终接近于零(或就此而言为一)。
这是一个简单的例程,可以避免对接近 1 或 0 的值进行测试:
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.
该函数测试该值与四舍五入到最接近整数的值之间的绝对差值是否小于合理限制。
请注意,没有绝对的把握。那将需要使用十进制浮点运算库。
我将留给感兴趣的 reader 来实现排除自然数范围之外的整数,无论是否包括零在内的所有负数。
如果要测试的值大于 Round()
函数的上限,请使用等效的浮点函数。在 Delphi 即 Math.RoundTo(value,0)
.
我有 2 个实数(例如 a、b)。有什么办法可以知道他们除法的结果是不是自然数? 我试过了
a mod b {to check if the result is 0}
但 "mod" 不适用于实数。 还有
a/b-trunc(a/b) {but sometimes the answer isn't 0}
我是初学者,请问有没有其他方法,请告诉我。
使用 Frac
可能是@Sertac 提到的一种想法。但由于二进制浮点数并不代表所有实数,因此在某些情况下分数可能最终接近于零(或就此而言为一)。
这是一个简单的例程,可以避免对接近 1 或 0 的值进行测试:
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.
该函数测试该值与四舍五入到最接近整数的值之间的绝对差值是否小于合理限制。
请注意,没有绝对的把握。那将需要使用十进制浮点运算库。
我将留给感兴趣的 reader 来实现排除自然数范围之外的整数,无论是否包括零在内的所有负数。
如果要测试的值大于 Round()
函数的上限,请使用等效的浮点函数。在 Delphi 即 Math.RoundTo(value,0)
.