如何测试一个数的平方根是否合理?

时间:2011-11-16 11:07:54

标签: objective-c math

如何测试数字的平方根是否合理?

这甚至可能吗?

我需要这个,因为我需要弄清楚是否在我正在开发的数学应用程序中显示一个数字作为一个数字。

5 个答案:

答案 0 :(得分:6)

对于整数输入,only the square roots of the square numbers are rationals.因此,您的问题归结为查找您的数字是否为正方形数字。比较问题:What's a good algorithm to determine if an input is a perfect square?

如果您将有理数作为输入(即,以两个整数之间的比率给出的数字),请检查除数和被除数是否为正方形。

对于浮点值,可能没有解决方案,因为您无法使用截断的十进制表示来检查数字是否合理。

答案 1 :(得分:3)

wikipedia当且仅当x是有理数时,x的平方根才是有理数,可以表示为两个完美正方形的比率。

因此,您需要为输入号码找到rational approxmiation。到目前为止,我已经确定执行此任务的唯一算法是使用Saturn Assembler为HP48系列计算器编写的。

答案 2 :(得分:2)

在阅读了another question的评论和答案之后我才意识到,问题来自于浮点不准确,这意味着某些值(例如0.01)会在最后的逻辑测试中失败。程序。我已将其修改为使用NSDecimalNumber变量。

double num, originalnum, multiplier;
int a;

NSLog(@"Enter a number");
scanf("%lf", &num);
//keep a copy of the original number
originalnum = num;

//increases the number until it is an integer, and stores the amount of times it does it in a
for (a=1; fmod(num, 1) != 0 ; a++) {
    num *= 10;
}

a--;
//when square-rooted the decimal points have to be added back in
multiplier = pow(10, (a/2));
if (fmod(originalnum, 1) != 0) {
    multiplier = 10;
}

NSDecimalNumber *temp = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:sqrt(num)/multiplier] decimalValue]];
NSDecimalNumber *result = [temp decimalNumberByMultiplyingBy:temp];
NSDecimalNumber *originum = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:originalnum] decimalValue]];

if ((fmod(sqrt(num), 1) == 0) && ([result isEqualToNumber:originum])) {
    NSLog(@"The square root of %g is %@", originalnum, temp);
}
else {
    NSLog(@"The square root of this number is irrational");
}

答案 3 :(得分:1)

如果您正在处理整数,请注意正整数具有有理平方根当且仅当具有整数时平方根,也就是说,如果它是一个完美的正方形。有关测试的信息,请参阅this amazing StackOverflow question

答案 4 :(得分:0)

https://math.stackexchange.com/ 上有一个问题 What rational numbers have rational square roots? 产生了 an answer from Jakube,它指出对于“...有理数,答案是确定分子和分母是否是整数2 的幂。”

确定自然数是否为完全平方数的好方法取决于函数支持的自然数(以及所使用的计算机编程语言)和可用内存等。以下是一组有用的链接:

我用 Java 开发并测试了一个解决方案,该解决方案对我来说对一组自然数来说足够好。其要点如下。此代码依赖于 BigMath 并在 agdt-java-math 中实现,尽管在几个不同的类中:

    /**
     * @param x The number to return the square root of (if the result is
     * rational).
     * @return The square root of x if that square root is rational and
     * {@code null} otherwise.
     */
    public static BigRational getSqrtRational(BigRational x) {
        BigInteger[] numden = getNumeratorAndDenominator(x);
        BigInteger nums = getPerfectSquareRoot(numden[0]);
        if (nums != null) {
            BigInteger dens = getPerfectSquareRoot(numden[1]);
            if (dens != null) {
                return BigRational.valueOf(nums).divide(BigRational.valueOf(dens));
            }
        }
        return null;
    }

    /**
     * @param x The value for which the numerator and denominator are returned.
     * @return The numerator and denominator of {@code x}
     */
    public static BigInteger[] getNumeratorAndDenominator(BigRational x) {
        BigInteger[] r = new BigInteger[2];
        r[0] = x.getNumeratorBigInteger();
        r[1] = x.getDenominatorBigInteger();
        if (Math_BigInteger.isDivisibleBy(r[0], r[1])) {
            r[0] = r[0].divide(r[1]);
            r[1] = BigInteger.ONE;
        }
        return r;
    }

    /**
     * @param x The number to return the square root of if that is an integer.
     * @return The square root of {@code x} if it is an integer and {@code null}
     * otherwise.
     */
    public static BigInteger getPerfectSquareRoot(BigInteger x) {
        if (x.compareTo(BigInteger.ZERO) != 1) {
            return null;
        }
        BigInteger xs = x.sqrt();
        if (x.compareTo(xs.multiply(xs)) == 0) {
            return xs;
        }
        return null;
    }

此外,任何有理数的平方都是有理数,无理数是无理数的平方根。阅读Yves answer to: Prove that the square root of any irrational number is irrational后,我很清楚这一点。因此,处理有理数的情况足以回答所有实数的问题。