차례:
- 정수 오버 플로우
- 부동 소수점 숫자는 자체적으로 문제가 있습니다. 우선, 부동 소수점 수는 2 진수 시스템 (2 진수)을 사용하여 저장되지만 인간은 10 진수 시스템 (10 진수)으로 작업합니다. 불행하게도이 두 시스템 사이의 숫자를 정확하게 변환하는 것은 때때로 불가능합니다. 왜냐하면 어떤 수의 기준에서도 정확하게 어떤 분수를 표현할 수 없기 때문입니다.한 예 : 자료 10은 분수 1/3을 정확하게 표현할 방법이 없다. 당신은 그것을 3333333으로 근사 할 수 있지만, 결국 당신이 저장할 수있는 자릿수의 한계에 도달하므로, 당신은 멈춰야 만합니다. 2 진수에서는 정확히 표현할 수없는 부분 중 하나가 10 진수 값 1/10입니다. 즉,
- a = c / b
비디오: Dummy : no way out 더미 : 노 웨이 아웃 ㅣAniSEED 2024
믿거 나 말거나 컴퓨터는 가장 강력한 컴퓨터 일지라도 수학 계산을 수행 할 때 특정 제한이 있습니다. 이러한 제한은 대개 중요하지 않지만 때로는 몰래 들어 와서 물기도합니다. 자바에서 수학 할 때주의해야 할 것들이 있습니다.
정수 오버 플로우
정수형의 기본적인 문제는 고정 된 크기라는 것입니다. 결과적으로
short
,
int
또는
long
유형의 변수에 저장할 수있는 숫자의 크기에는 제한이 있습니다.
긴
변수가 거대한 숫자를 보유 할 수 있지만 조만간
긴
변수에 맞기에는 너무 큰 숫자를 발견하게됩니다.
좋습니다. (예를 들어 인위적으로 고안 한) 예를 생각해보십시오.
int a = 1000000000;
시스템. 아웃. println (a);
a + = 1000000000;
시스템. 아웃. println (a);
a + = 1000000000;
시스템. 아웃. println (a);
a + = 1000000000;
시스템. 아웃. println (a);
여기에 추가 할 때마다
값이 커질 것으로 예상됩니다. 그러나 출력 결과는 다음과 같습니다.
1000000000
2000000000
-1294967296
-294967296
첫 번째 추가가 작동하는 것으로 보이지만 이후에는 음수가됩니다! 값이
int
데이터 유형의 크기 제한에 도달했기 때문입니다. 불행히도 Java는이 오류가 발생했다는 사실을 알려주지 않습니다. 단순히
int
변수를 비트로 가득 채우고 비트가 맞지 않더라도 무시하고 희망을 알기를 희망합니다.
int
가 음수 값을 저장하는 방식 때문에 큰 양수 값은 갑자기 큰 음수 값이됩니다.
가 아닌
long
를 사용해야한다는 것입니다. 왜냐하면
long
는
int
보다 훨씬 큰 수를 저장할 수 있습니다. 프로그램에서
long
에 문제가 될만큼 큰 숫자를 처리하는 경우 부동 소수점 유형을 대신 사용해보십시오. 부동 소수점 유형은
long
보다 큰 값을 처리 할 수 있으며 용량을 초과하면 알려줍니다.
부동 소수점 이상한 숫자
부동 소수점 숫자는 자체적으로 문제가 있습니다. 우선, 부동 소수점 수는 2 진수 시스템 (2 진수)을 사용하여 저장되지만 인간은 10 진수 시스템 (10 진수)으로 작업합니다. 불행하게도이 두 시스템 사이의 숫자를 정확하게 변환하는 것은 때때로 불가능합니다. 왜냐하면 어떤 수의 기준에서도 정확하게 어떤 분수를 표현할 수 없기 때문입니다.한 예: 자료 10은 분수 1/3을 정확하게 표현할 방법이 없다. 당신은 그것을 3333333으로 근사 할 수 있지만, 결국 당신이 저장할 수있는 자릿수의 한계에 도달하므로, 당신은 멈춰야 만합니다. 2 진수에서는 정확히 표현할 수없는 부분 중 하나가 10 진수 값 1/10입니다. 즉,
float
또는
double
변수는
0을 정확하게 나타낼 수 없습니다. 1 999.
이 코드를 실행 해보십시오:
float x = 0. 1f;
NumberFormat nf = NumberFormat. getNumberInstance ();
nf. setMinimumFractionDigits (10);
시스템. 아웃. println (nf. 형식 (x));
결과 출력은
0입니다. 1000000015
비록
0. 1000000015
는
~
0이다. 1
, 정확하지 않습니다. 대부분의 경우 Java의 부동 소수점 연산은 중요하지 않으므로 충분히 근접합니다. 오류 마진은 극히 적습니다. 자바를 사용하여 집 크기를 측정하는 경우 전자 현미경을 사용하여 오류를 알아야합니다. 그러나 금융 거래를 처리하는 응용 프로그램을 작성하는 경우 정상적인 반올림을 사용하면 실수를 확대하여 중요하게 만들 수 있습니다. 페니 요금을 너무 많이 내지 너무 적게 부과 할 수 있습니다. 극단적 인 경우 인보이스에는 실제로 명백한 추가 오류가있을 수 있습니다. 정수형은 물론 바이너리 형식으로 저장됩니다. 그러나 정수는 부동 소수점 유형과 동일한 오류가 발생하지 않습니다. 정수가 정수를 나타내지 않으므로
정수
유형에 대해이 유형의 오류를 염려 할 필요가 없습니다.
0으로 나누기
수학의 기본 규칙에 따라 숫자를 0으로 나눌 수 없습니다. 이유는 간단합니다. 나누기는 곱셈의 역수입니다. 즉,
a * b = c
인 경우
a = c / b
도 마찬가지입니다.
b
가 0이되도록 허용하는 경우, 0을 곱한 숫자가 0이기 때문에 나누기는 의미가 없습니다. 따라서
a
와
c
도 모두 0이어야합니다. 요컨대, 수학자들은 수세기 전에 0으로 나누는 것이 허용되지 않는다고 말함으로써 이러한 딜레마를 해결했습니다.
Java 프로그램에서
숫자를 0으로 나누려고하면 어떻게됩니까? 대답은 정수 또는 부동 소수점을 나누는 지 여부에 달려 있습니다. 정수를 나누는 경우, 0으로 나누기를 시도하는 문은 프로그램을 무의식하게 중단시키는
예외
를 질식시킵니다. 이 예외를 가로 채서 여기에서 찾을 수없는 프로그램을 계속 진행할 수있는 방법이 있습니다. 그 동안, 당신이 쓰는 프로그램은 0으로 정수 나누기를 시도합니다. 부동 소수점 유형을 0으로 나누려고하면 결과가 너무 급격하지 않습니다. 대신 Java는 부동 소수점 결과에 아래 표에 나열된 특수 값 중 하나를 지정합니다. 다음 단락에서는 이러한 특수 값을 결정하는 방법을 설명합니다. 숫자를 0으로 나누고 두 숫자의 부호가 같으면 결과는 양의 무한대입니다.0. 0 999로 나눈 값이다. 0 999는 양의 무한대이고 999 - 34이다. 0-999-0으로 나눈 값이다. 0 999이다. 숫자를 0으로 나누고 숫자 기호가 다른 경우 결과는 음의 무한대입니다.
-40. 0 999로 나눈 값이다. 0 999는 음의 무한대이며 999입니다. 0 999로 나눈 값이다. 0 999이다.
0을 0으로 나누면 결과는 부호와 관계없이 숫자 (NaN)가 아닙니다.
- float 및 double 클래스의 특수 상수
상수
의미POSITIVE_INFINITY
양의 무한대NEGATIVE_INFINITY
음의 무한대NaN
숫자가 아님 - 부동 소수점 0은 양수 또는 음수 일 수 있습니다. Java는 양수와 음수 0을 숫자로 동일하게 간주합니다.
이러한 특수 값 중 하나를 갖는 부동 소수점 값을 인쇄하려고하면 Java가 해당 값을 적절한 문자열로 변환합니다. 다음 문을 실행한다고 가정 해보십시오.
double x = Math. sqrt (-50); // 숫자가 아님double y = x;
if (x == y)시스템. 아웃. println ("x는 y와 같음");
i
가 - -50이면 결과 콘솔 출력은
입니다. 0 | , 콘솔은 |
-Infinity
|
를 표시하고 |
i
|
가 0이면 콘솔에 |
NaN
|
이 표시됩니다. |
NaN
는 그 자체와 같지 않습니다. 일부 이상한 결과가 발생할 수 있습니다. 예:
double x = Math. sqrt (-50); // 숫자가 아님
double y = x;
if (x == y)
시스템. 아웃. println ("x는 y와 같음"); 논쟁을 위해서
if
문은 변수
x
가 변수
y
와 같은지 테스트합니다. 이 테스트는
x
의 값을
y
에 할당하는 할당 문 바로 뒤에 있으므로
x
는
y
와 같다고 가정 할 수 있습니다. 권리?
-
잘못되었습니다. 999는 999이며, 999는 또한 999이다.
NaN
는 다른
NaN
를 포함하여 다른 값과 같은 것으로 간주되지 않습니다. 따라서
if
문에서 비교가 실패합니다.
또 다른 이상한 결과: 숫자 자체가 항상 0이라고 가정 할 수는 없습니다. 다음 진술을 고려하십시오.
double z = x - x; // 반드시 필수는 아닙니다.
이 문장은 항상
z
를 0으로 설정하면 안됩니까?
x
가
NaN
이 아닌 경우 이 경우 숫자가 아닌 숫자가 아니라 숫자가 아닙니다.
하나 이상의 이상 함: 무한대와 관련된 수학 연산은 무한대 또는
NaN
이됩니다. 예를 들어, Infinity + 5는 여전히 무한대와 동일하므로 Buzz Lightyear의 호출은 "무한 이상으로! "단지 일어나지 않을 것입니다. 그러나 무한대에서 무한대를 빼면 …
NaN
.