source

Java에서 숫자를 거듭제곱하다

factcode 2022. 9. 29. 00:09
반응형

Java에서 숫자를 거듭제곱하다

여기 제 코드가 있습니다.내 체질량지수가 어떤 이유에서인지 정확하게 계산되지 않았다.계산기로 이 출력을 체크하면 다음과 같습니다.(10/((10/100)^2)))저는 1000점인데 제 프로그램에서는 5점이에요.제가 뭘 잘못하고 있는지 모르겠어요.코드는 다음과 같습니다.

import javax.swing.*;

public class BMI {
    public static void main(String args[]) {
        int height;
        int weight;
        String getweight;
        getweight = JOptionPane.showInputDialog(null, "Please enter your weight in Kilograms");
        String getheight;
        getheight = JOptionPane.showInputDialog(null, "Please enter your height in Centimeters");
        weight = Integer.parseInt(getweight);
        height = Integer.parseInt(getheight);
        double bmi;
        bmi = (weight/((height/100)^2));
        JOptionPane.showMessageDialog(null, "Your BMI is: " + bmi);
    }
}

^java에서는 제곱을 의미하는 것이 아닙니다.XOR을 의미합니다.

Java를 사용할 수 있습니다.Math.pow()


그리고 이 기능을 사용하는 것을 고려해 보는 것이 좋을 것 같습니다.double대신int: 즉,

double height;
double weight;

주의:199/1001로 평가합니다.

사용할 수 있다

Math.pow(2, 4);

이는 2의 4제곱(2^4)을 의미합니다.

응답 = 16

^원하는 연산자가 아닙니다.의 메서드를 찾고 있습니다.

사용할 수 있습니다.Math.pow(value, power).

예제:

Math.pow(23, 5); // 23 to the fifth power

당신의 계산이 범인일 겁니다.사용 방법:

bmi = weight / Math.pow(height / 100.0, 2.0);

왜냐하면 둘 다height그리고.100정수이기 때문에 나눗셈할 때 틀린 답을 얻을 수 있습니다.하지만,100.0더블입니다.나는 당신이 만들 것을 제안합니다.weight더블도 있어요.또,^연산자는 전원용이 아닙니다.를 사용합니다.Math.pow()대신 메서드를 사용합니다.

작전에는 물론 너무 늦었지만 그래도...표현 방식을 다음과 같이 재구성합니다.

int bmi = (10000 * weight) / (height * height)

부동 소수점을 모두 제거하고 나눗셈을 상수에서 곱셈으로 변환합니다. 곱셈은 더 빨리 실행됩니다.정수 정밀도는 이 응용 프로그램에 적합할 수 있지만 그렇지 않은 경우:

double bmi = (10000.0 * weight) / (height * height)

여전히 개선될 것입니다.

다음 방법을 사용해야 합니다.

Math.pow (더블 a, 더블 b)

송신원(https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#pow-double-double-)

첫 번째 인수의 값을 두 번째 인수의 거듭제곱으로 반환합니다.

int weight=10;
int height=10;
double bmi;
bmi = weight / Math.pow(height / 100.0, 2.0);
System.out.println("bmi"+(bmi));
double result = bmi * 100;
result = Math.round(result);
result = result / 100;
System.out.println("result"+result);

1) 보통 int 데이터형은 키, 무게, 거리, 온도 등에 사용하지 않습니다(소수점을 가질 수 있는 변수).따라서, 키, 무게는 두 배 또는 부동이어야 합니다. 그러나 소수점이 많을 경우 부동보다 두 배가 더 정확합니다.

2) ^ 대신 다음과 같이 계산을 변경할 수 있습니다.Math.pow()

bmi = (weight/(Math.pow(height/100, 2)));

3)Math.pow()메서드의 정의보다 낮음

Math.pow(double var_1, double var_2);

예제:

i)Math.pow(8, 2)64(8의 거듭제곱 2)가 생성됩니다.

ii)Math.pow(8.2, 2.1)82.986813689753 (8.2의 제곱 2.1)

Math.pow(x,2)와 x*x를 사용하여 벤치마킹을 실시했더니 Math.pow()는 수동으로 곱하는 것보다 40배 느리기 때문에 약간의 퍼포먼스가 필요한 경우에는 권장하지 않습니다.

결과는 다음과 같습니다.

proof_of_work: 19.284756867003345
time for Math.pow(x,2) in ns: 35143
proof_of_work: 19.284756867003345
time for x*x in ns: 884
manual calculation is 39 times faster

여기 테스트 코드가 있습니다.

double r1 = 4.391441320;
long multiply_d1 = System.nanoTime();
double multiply_dr = Math.pow(r1,2);
long multiply_d2 = System.nanoTime();
System.out.println(("proof_of_work: ") + (multiply_dr));
System.out.println(("time for Math.pow(x,2) in ns: ") + (multiply_d2 - multiply_d1));
long multiply_t1 = System.nanoTime();
double multiply_tr = r1*r1;
long multiply_t2 = System.nanoTime();
System.out.println(("proof_of_work: ") + (multiply_tr));
System.out.println(("time for x*x in ns: ") + (multiply_t2 - multiply_t1));
System.out.println(("manual calculation is ") + ((multiply_d2 - multiply_d1) / (multiply_t2 - multiply_t1)) + (" times faster"));

가장 효율적인 솔루션은

public Float fastPow(Float number, Integer power) {
        if (power == 0) {
            return 1.0f;
        } else if (power % 2 == 1) {
            return fastPow(number, power - 1) * number;
        } else {
            return fastPow(number * number, power / 2);
        }
    }

A를 숫자, N을 검정력이라고 합시다.다음으로 A^2^N = (A^2)^N.그리고 A^N = (A^2)^N/2.위의 함수는 이 관계를 반영합니다.

언급URL : https://stackoverflow.com/questions/8842504/raising-a-number-to-a-power-in-java

반응형