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/100
1로 평가합니다.
사용할 수 있다
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
'source' 카테고리의 다른 글
Python에서 잘못된 인수/불법 인수 조합에 대해 어떤 예외를 제기해야 합니까? (0) | 2022.09.29 |
---|---|
개체 배열에서 메서드 색인화하시겠습니까? (0) | 2022.09.29 |
팬더 데이터 프레임을 NumPy 어레이로 변환 (0) | 2022.09.29 |
MySQL 및 PHP - 빈 문자열 대신 NULL을 삽입합니다. (0) | 2022.09.29 |
Python을 사용한 디렉토리 반복 (0) | 2022.09.28 |