我为指数编写的这个基本程序只适用于整数——我做错了啥?

Posted

技术标签:

【中文标题】我为指数编写的这个基本程序只适用于整数——我做错了啥?【英文标题】:This basic programme I wrote for exponents only works with integers - what did I do wrong?我为指数编写的这个基本程序只适用于整数——我做错了什么? 【发布时间】:2019-02-23 11:28:32 【问题描述】:

我正在构建一些基本程序,作为练习不同编程技术的一种方式。我以为我写了一个程序来计算指数,但它不能正常工作。

如果我输入整数,它就可以正常工作,即。平方 (2,5) 但 (2,4.5) 不起作用。

public static double squared(double a, double b) 
    double a1 = a;
    double sq = 0;      
    while (b > 1) 
        sq = a*a1;
        a =sq;
        b--;
    
    return sq;


public static void main(String[] args) 
    System.out.println(squared(2,2));

【问题讨论】:

我看到你在使用while循环,如果b的输入是4.5,这个循环会“循环”多少次? 谢谢您,先生。很明显,我:squared(facepalm, 10); 因为我看不出有什么问题,所以我复制它并尝试了它:完全没有问题。 squared(2,4,5) 给出应有的 32.0。你没想到它会做一个乘法,只执行到一半,然后突然停在中间什么的,是吗? 【参考方案1】:

如果b 是整数,您的程序将按预期运行,因为您的代码假定b 是整数。

无论b 是 4 还是 4.5,都会计算出相同的结果,因为 0 和 0.5 都小于 1(从而结束循环)。

【讨论】:

【参考方案2】:

您的算法适用于整数,但为了使用浮点指数计算幂,您的方法不起作用。

首先,让我们以pow(2, 4.5) 为例,明确浮点指数的含义:

所以为了计算这个,首先我们必须将浮点数转换为分数,然后计算幂和平方根。这是可行的,但它非常乏味,而且它们是更好的解决方案。

如果我们有,其中b可以是浮点数,A是结果,我们可以取两边的对数:

相当于:

简化为:

现在这可以很容易地在 Java 中完成:

public static void main(String args[]) 
    double a = 2;
    double b = 4.5;
    double A = Math.exp(b * Math.log(a));
    System.out.println(A);

如果你不想使用内置的exp函数,我们可以使用Newton-Raphson公式来计算:

其中:! 表示数字的阶乘。 您的初始算法可用于计算具有整数指数的xpow

【讨论】:

以上是关于我为指数编写的这个基本程序只适用于整数——我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

这个 MERGE / INSERT 查询我做错了啥?

这个简单的模板类我做错了啥?

这个 AFNetworking JSON 帖子我做错了啥?

Fullcalendar dayClick 代码只触发一次:我做错了啥?

ARM 汇编语言 uART0 输入输出,我做错了啥。

单对象 json 解析 - 我做错了啥?