プログラムで2組の数のペアの比が等しいか判定する

March 13, 2020, 4:09 a.m. edited March 13, 2020, 4:12 a.m.

#C++  #数学  #Python 

例えばC言語とか(PythonとかC#とかでもなんでも良い)で

int a0 = 1, a1 = 3;
int b0 = 5, b1 = 15;

とあったときにその比が等しいか判定したいとする。愚直に

if(a0 / a1 == b0 / b1) {
    printf("比は等しいよ")
}

とすると、int型のため1/30になるので、例えばa1 = 4でも等しいと判定されてしまう(Pythonなら割り算に//を使った場合と同じ)。

それならfloatにするのも良さそうに思える(Pythonなら割り算に/を使った場合と同じ)が、浮動小数点演算による誤差の影響が心配である1

そのため、

if(abs(a0 / a1 - b0 / b1) < 0.000001) {
    printf("比は等しいよ")
}

とか(Pythonならmath.isclose()やUnity C#ならMathf.Approximately())やれば良いことになるが面倒である(問題になることは少ないであろうが不正確でもある)。

解決策

$$ \frac{a_0}{a_1} = \frac{b_0}{b_1} $$

$$ a_0 \times b_1 = b_0 \times a_1 $$

と変形できるので、int型のままで

if(a0 * b1 == b0 * a1) {
    printf("比は等しいよ")
}

としてやれば良い。


  1. 例えばPythonでは

    >>> 0.1 * 3 == 0.3
    False
    
    となってしまう。