Lua는 정수와 부동 수를 어떻게 처리합니까?


11

내가 프로그래밍을 기억하는 한 부동 소수점 숫자가 동일한 지 비교하지 않도록 배웠습니다. 이제 Lua 유형 에 대한 프로그래밍을 Lua에서 읽는 동안 number다음을 발견했습니다.

숫자 유형은 실수 (배정 밀도 부동 소수점) 숫자를 나타냅니다. 루아는 필요하지 않기 때문에 정수 타입이 없습니다. 부동 소수점 산술 오류에 대한 오해가 널리 퍼져 있으며 일부 사람들은 간단한 증분조차도 부동 소수점 숫자로 이상하게 보일 수 있다고 우려합니다. 실제로 double을 사용하여 정수를 나타낼 때 반올림 오류가 전혀 없습니다 (숫자가 100,000,000,000,000을 초과하지 않는 한). 특히, 루아 수는 반올림 문제없이 긴 정수를 나타낼 수 있습니다. 또한 대부분의 최신 CPU는 정수 산술만큼 빠른 (또는 훨씬 빠른) 부동 소수점 산술을 수행합니다.

모든 언어에 해당됩니까? 기본적으로 부동 소수점을 두 배로 넘지 않으면 정수 연산이 안전합니까? 또는 질문 제목에 더 맞기 위해 Lua가 해당 number유형으로 수행하는 특별한 기능이 있으므로 정수 및 부동 소수점 유형으로 잘 작동합니까?



@JoonasPulakka 감사합니다, 그것은 매우 귀중한 추가입니다.
Petr Abdulin

답변:


11

Lua는 부동 소수점 숫자는 정수 유형과 똑같이 정수를 나타낼 수 있다고 주장하며 동의합니다. 처리 할 소수 부분의 부정확 한 표현은 없습니다. 정수를 정수 유형으로 저장하든 부동 소수점 숫자의 가수로 저장하든 결과는 동일합니다. 가수의 비트 수를 초과하지 않는 한 해당 정수를 정확하게 표현할 수 있습니다. , 지수에서 1 비트.

물론 실제 부동 소수점 숫자 (예 : 12.345)를 부동 소수점 표현으로 저장하려고하면 모든 베팅이 해제되어 있으므로 프로그램은 숫자가 실제로 가수를 실제 정수처럼 취급하기 위해 (즉, 평등 비교와 관련하여) 가수.

그보다 더 많은 정수 정밀도가 필요한 경우 언제든지 임의 정밀도 라이브러리를 사용할 수 있습니다 .

추가 정보
루아에서 숫자의 최대 값은 얼마입니까?


두 번째 주장은 어떻습니까? 즉, 부동 소수점은 현대 CPU에서 정수 산술보다 빠르거나 빠릅니다. 부동 소수점 숫자를 사용하여 정수 산술을 수행하는 경우에도 의심스러운 소리가납니다.
Andres F.

2
@AndresF. 두 가지 대신 단일 숫자 유형을 사용하여 캐스트를 제거하지 않는 한 더 빠른 방법을 알 수 없습니다.
Robert Harvey

동의했다. 나에게 이해가되지 않습니다. 문맥에서 벗어난 것인지 궁금합니다.
Andres F.

1
충분히 큰 정수 부동 소수점 객체에 정확하게 저장할 수 없습니다 . 64- 비트 double는 약 51 정도의 가수 비트를 가진다; 약 2 ** 51보다 큰 홀수 정수는 반올림 오류가 발생합니다. 64 비트 정수는 지수에 비트를 할당하지 않으므로 더 큰 정수 값을 정확하게 저장할 수 있습니다.
Keith Thompson

@ KeithThompson : 나는 "가수에 저장했다"고 대답했을 때 내 대답에 암시되었다고 생각했습니다. 그러나 명확히하기 위해 답변을 편집하겠습니다.
Robert Harvey

6

복식은 가수와 지수로 저장됩니다. 자세한 내용 은 형식 을 참조하십시오. 기본적으로 모든 숫자는 mantissa * 2 exponent 형식 입니다. 2 52 보다 작은 정수의 경우 지수는 0이되어 비트의 가수 비트는 52 비트 부호없는 정수와 같습니다. 음수를 나타 내기 위해 별도의 부호 비트가 사용됩니다.

실제로, 52 nd 이후의 모든 숫자 가 0 인 한 , 2 52 보다 큰 일부 정수조차 정확하게 표현 될 수 있습니다 . 또한 0.5와 같은 일부 분수는 정확하게 표현 될 수 있습니다. 분수가 밑면 2에서 1/3과 같이 지속적으로 반복되거나 기수 점을 지나서 너무 많은 비트가 필요할 때만 정밀도가 떨어집니다.


지속적으로 소수점을 반복하기 때문이 아닙니다. 소수점 이하 10 진수는 2의 거듭 제곱으로 정확하게 표현할 수 없기 때문입니다.
Robert Harvey

3
기본 2 년, 정확히 표현할 수없는 숫자는 것이다 지속적으로 반복합니다. 예를 들어, 0.1 진수는 이진수로 0.0 (0011)이되고 0011은 계속 반복됩니다.
Karl Bielefeldt

3
예, 정확히 그러나베이스 10에서 반복되지 않습니다.베이스 2에서 반복
Robert Harvey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.