본문 바로가기

프로그래밍/java

Java Math Operators and Math Class

http://tutorials.jenkov.com/java/math-operators-and-math-class.html


Java Math Operators

Java Integer Math - cut off 

int result = 100 / 8;

The result of this division would be 12.5 , but since the two numbers are integers, the .5 fraction is cut off. The result is therefore just 12.


Java Floating Point Math - use D or F

double result = 100D / 8D;


Floating Point Precision

double resultDbl3 = 0D;

System.out.println("resultDbl3 = " + resultDbl3);


for(int i=0; i<100; i++){

    resultDbl3 += 0.01D;

}

System.out.println("resultDbl3 = " + resultDbl3);

The output printed when executing this code with Java 8 is:


resultDbl3 = 0.0

resultDbl3 = 1.0000000000000007


그래서 자바의 실수(float, double) 부동소수점 연산은 불완전 하기 때문에 돈과 관련된 경우 혹은 소수점 이하의 수치가 정확해야만 하는 경우에는 사용해서는 안된다.


그래서 BigDecimal 클래스가 있다.

BigDecimal d = new BigDecimal("0");

BigDecimal adder = new BigDecimal("0.01");

for(int i=0; i<100; i++){

d = d.add(adder);

}

System.out.println("result = " + d);


result = 1.00


Exponential and Logarithmic Math Functions

Math.floorDiv (int or long) 함수

1.8 버전에 추가된 함수인데, Integer 연산에서 피제수(dividend)가 양수인 경우는 기존의 나눗셈과 동일하게 소수점 이하는 버리지만, 음수인 경우는 floor 처리되어 더 작은 음수로 계산된다.

double result3 = Math.floorDiv(-100,9);

System.out.println("result3: " + result3);


double result4 = -100 / 9;

System.out.println("result4: " + result4);

The output printed from this Java code is:


result3: -12.0

result4: -11.0


단, 여기서 대부분의 Math 함수는 실수연산을 가정하고 있기 때문에 입력 파라메터가 double 이지만, floorDiv 함수는 입력 파라메터가 정수형(int, long)이며, 정수의 음수 floor 처리를 위한 함수임을 알고 있어야 한다. 


 잠깐 딴 생각을 해보면, 대부분의 Math round, floor, ceil 함수는 실수연산을 위한 함수이지, 정수를 위해서 굳이 그러한 함수를 만들 이유는 없겠다. 실수연산은 실수를 입력을 가정한 것이지 정수연산 결과가 실수로 나온 것에 대한 함수는 아닐 수 있겠다.


Math.random 함수

double random = Math.random();

double random = Math.random() * 100D;

0과 1사이의 값을 반환하며, 임의의 0~100 사이의 정수를 만들기 위해서는 100을 곱하고 floor, ceil 함수를 이용하면 가능하다.


Math.exp 함수 - Wikipedia e (상수)

상수 e는 탄젠트 곡선의 기울기에서 유도되는 특정한 실수로 무리수이자 초월수이다. 스위스의 수학자 레온하르트 오일러의 이름을 따 오일러의 수로도 불리며, 로그 계산법을 도입한 스코틀랜드의 수학자 존 네이피어를 기려 네이피어 상수라고도 한다. 또한, e는 자연로그의 밑이기 때문에 자연상수라고도 불린다.[1] e는 π10i 등과 함께 수학의 중요한 상수로 취급된다.[2]

e는 무리수이기 때문에 십진법으로 표현할 수 없고 근삿값만을 추정할 수 있다. 소수로 나타낸 e의 근삿값은 대략 다음과 같다.

e = 2.71828\ 18284\ 59045\ 23536\ 02874\ \cdots


Returns Euler's number e raised to the power of a double value. Special cases:

Parameters:
a the exponent to raise e to.
Returns:
the value ea, where e is the base of the natural logarithms.


exp() : e 지수 : double z = Math.exp(x) : z = e 의 x승
pow() : 거듭제곱 : double z = Math.pow(x,y) : z = x의 y승


 또 잠시 옆딱길로 빠지면, 왜 여태까지 x ^y 연산이 거듭제곱이라고 생각했던 때가 있었을까, 매번 헛갈리긴 하는데 왜 그럴까.. 아무튼 두 가지 "e의 지수승" 과 "거듭제곱"에 대한 개념을 헛갈리지 말자. 그리고 C, Java 언어에서 지수승, 거듭제곱을 위한 Operator 는 제공하지 않으며 함수만 제공한다.

Math.log 함수

오일러의 수를 밑으로 하는 자연로그 함수, e 지수 함수의 역함수이므로 exp(1) = 2.71.. Math.log(Math.exp(1)) 값은 1 이 된다. 


 exp 함수는 2.7의 지수승의 값을 구하는 함수이고, log 함수는 값이 2.7의 제곱이 되는 지수를 구하는 함수로 이해하면 되겠다.


 포맷팅 함수 예제 - Stackoverflow

// you can format to any output you want
NumberFormat formatter = new DecimalFormat("0.00000000000");
String string = formatter.format(9.870699812169277E-4);
System.out.println(string);


Trigonometric Math Functions

삼각함수 아련하다... 그래도 잘 모르겠다.. 그래서 Wikipedia (삼각함수)

수학에서, 삼각함수(三角函數, 영어: trigonometric function)는 직각삼각형의 을 직각삼각형의 변들의 길이의 비로 나타내는 함수이다. 이는 복소수의 지수 함수의 실수 · 허수 부분이며, 따라서 복소수를 다룰 때 핵심적인 역할을 한다. 가장 근본적인 주기함수이며, 각종 주기적 현상을 다룰 때 푸리에 급수의 형태로 등장한다.

삼각함수에는 3개의 기본 함수가 있으며, 이들은 사인(문화어: 씨누스, 영어: sine, 기호 sin) · 코사인(문화어: 꼬씨누스, 영어: cosine, 기호 cos) · 탄젠트(문화어: 땅겐스, 영어: tangent, 기호 tan)라고 한다. 이들의 역수는 각각 코시컨트(문화어: 꼬쎄깐스, 영어: cosecant, 기호 csc) · 시컨트(문화어: 쎄깐스, 영어: secant, 기호 sec) · 코탄젠트(문화어: 꼬땅겐스, 영어: cotangent, 기호 cot)라고 한다.


Math.toDegree / toRadian 함수

Math.toDegree(Math.PI) = 180 degree

Math.toRadian(180) = 3.141592653589793



'프로그래밍 > java' 카테고리의 다른 글

Jenkov.com - Java String  (0) 2015.04.14
Jenkov.com - Java Data Types  (0) 2015.03.13
자바의 실수연산에 대한 실수  (0) 2014.11.24