소수점 이하 자릿수를 포함하는 유형 – float, double
이러한 데이터 유형을 종종 부동 소수점 데이터 유형이라고 합니다. 숫자는 부동 소수점 숫자라고 합니다.
float fvar = 50.15; 이중 dvar = 50.0;
부동 소수점 데이터 유형 비교 – float 및 double
float와 double 데이터 유형의 차이점은 모두 소수점 이하 자릿수의 정밀도에 관한 것입니다.
VexOS – ARM 7 사양에 따라 float는 6개 또는 7개 위치를 처리할 수 있고 double은 15개 또는 16개 위치를 처리할 수 있습니다.
float: 현재 V5os에서는 컨트롤러가 소수점 이하 8자리까지의 정밀도를 허용하는 것으로 보입니다.
예를 들어
float fvar1 = 1.12345670; 부동 fvar2 = 1.12345678;
fval1은 fvar2와 다릅니다.
대
float fvar1 = 1.123456780; 부동 fvar2 = 1.123456781;
fval1은 fvar2와 동일하게 평가됩니다.
double: 소수점 이하 17자리까지의 정밀도를 허용합니다.
예를 들어
이중 dvar1 = 1.12345678912345678; 이중 dvar2 = 1.12345678912345670;
dval1은 dvar2와 다릅니다.
대
이중 dvar1 = 1.123456789123456789; 이중 dvar2 = 1.123456789123456780;
dval1은 dvar2와 동일하게 평가됩니다.
높은 정밀도가 필요한 경우가 아니면 "double"을 사용하지 마십시오.
높은 정밀도가 필요하지 않은 경우 "double"을 사용하지 말아야 하는 두 가지 이유가 있습니다.
- 2X 플로트 유형을 사용합니다.
- 훨씬 더 높은 처리 능력을 차지합니다.
VexOS – ARM 7 사양에 따라 float는 6자리 또는 7자리를 처리할 수 있고 double은 15자리 또는 16자리를 처리할 수 있습니다. 두 경우 모두, double 또는 float의 마지막 숫자의 정확성에 의존해서는 안 됩니다. "부동 소수점 계산"(이 기사의 범위를 벗어남)으로 인해 "int"를 저장하는 것과는 매우 다르게 저장됩니다.
따라서 소수점 이하 몇 자리의 정확도가 떨어질 수 있습니다.
double에 대한 연산은 float에 비해 상당히 비용이 많이 들고, 부동 소수점 계산이라 불리는 것으로 인해 "정수"보다 훨씬 높습니다.
IEEE 표준에 따르면 다음은 보다 신뢰할 수 있는 범위 내에 있습니다.
유형 | 가장 작은 양수 값 | 최대 양수 값 | 정밀도 # |
뜨다 | 10 -38 x 1.17549 | 10 38 x 3.40282 | 6자리 |
더블 | 10 -308 또는 2.22507 | 10 308 x 1.79769 | 15자리 |
기본 데이터 유형을 교환할 수 있습니까? - 캐스팅
데이터 유형을 교환할 수 있습니다. 이 기술을 '캐스팅'이라고 합니다. 캐스팅은 일반적인 방법이지만 필요한 경우에만 수행하십시오.
가장 일반적인 방법 중 하나는 char와 int를 교환하는 것입니다.
이는 둘 다 한 가지 예외를 제외하고 정수 값을 나타내기 때문입니다.
- "int"에는 4바이트(또는 일부 컴파일러에서는 8바이트)가 포함됩니다.
- "char"에는 1바이트만 포함됩니다.
예를 들어
char aVal = 100; int iVal = aVal; // 암시적 캐스팅
또는
int iVal = (char) aVal; // 명시적 캐스팅.
암시적 잘림에 대한 주의 사항:
예를 들어
또 다른 일반적인 관행은 int와 float를 교환하는 것입니다.
float fVal = 5.486; 부동 소수점 = fVal - (int)fVal; // 그렇습니다: 5.486 - 5
암시적 잘림에 대한 주의 사항:
예를 들어
int iVal = 50; float fVal = iVal / 100;
이제 fVal = 0.0, 0.5가 아닙니다.
일부 시나리오에서는 종종 작업의 중요한 부분인 암시적 잘림을 활용하는 것이 좋습니다. 그러나 의도적으로 이 기술을 사용하고 있는지 확인해야 합니다.
암시적 잘림이 발생하지 않도록 하려면 명시적 캐스팅을 수행해야 합니다.
- 암시적 캐스팅:
float fVal = iVal / 100.0;
- 명시적 캐스팅:
float fVal = (float) iVal / 100