왜 1,000,000,000을 1000*1000*1000으로 C에 쓰는가?
애플이 만든 코드에는 다음과 같은 선이 있다.
CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )
표현해야 할 이유가 있는가?1,000,000,000
로서1000*1000*1000
?
그거 좋지1000^3
그 일 때문에?
사용하지 않는 이유가 있다.1000 * 1000 * 1000
.
16비트 포함int
,1000 * 1000
넘치다그래서 사용 1000 * 1000 * 1000
휴대성을 떨어뜨리다
32비트 포함int
, 다음 코드 첫 줄이 넘친다.
long long Duration = 1000 * 1000 * 1000 * 1000; // overflow
long long Duration = 1000000000000; // no overflow, hard to read
리드 값이 가독성, 휴대성 및 정확성을 위해 목적지 유형과 일치하도록 제안한다.
double Duration = 1000.0 * 1000 * 1000;
long long Duration = 1000LL * 1000 * 1000 * 1000;
또한 코드는 단순하게 사용할 수 있다.e
정확히 a로 나타낼 수 있는 값에 대한 표기법double
. 물론 이 사실은 이 사실을 알게 된다.double
정수 값을 정확히 나타낼 수 있음 - 1e9보다 큰 값과 관련된 문제임(참조).DBL_EPSILON
그리고DBL_DIG
).
long Duration = 1000000000;
// vs.
long Duration = 1e9;
상수를 승법적으로 선언하는 한 가지 이유는 가독성을 향상시키기 위해서인 반면 런타임 성능은 영향을 받지 않는다.또한 글쓴이가 숫자에 대해 곱셈적으로 생각하고 있었음을 나타내기 위해서였다.
다음을 고려하십시오.
double memoryBytes = 1024 * 1024 * 1024;
그것은 분명히 다음과 같은 것 보다 낫다.
double memoryBytes = 1073741824;
후자가 보지 않는 것처럼 얼핏 보면 1024의 제3의 힘이다.
아민 네그렘-아워드가 언급했듯이, 그 나라는^
연산자는 이항이다.XOR
. 많은 언어에는 내장 컴파일 시간 지수 연산자가 없으므로 곱셈이 있다.
그거 좋지
1000^3
?
의 결과1000^3
1003년 입니다. ^
비트-XOR 연산자.
그것이 Q 자체를 다루지 않는다 하더라도 나는 설명을 덧붙인다. x^y
을 항상 평가하지는 않는다.x+y
질문자의 예와 같이너는 매 순간마다 X 또는 X를 해야 한다.예를 들면 다음과 같다.
1111101000₂ (1000₁₀)
0000000011₂ (3₁₀)
1111101011₂ (1003₁₀)
그렇지만
1111101001₂ (1001₁₀)
0000000011₂ (3₁₀)
1111101010₂ (1002₁₀)
이유를 설명하려면 다음 테스트 프로그램을 고려하십시오.
$ cat comma-expr.c && gcc -o comma-expr comma-expr.c && ./comma-expr
#include <stdio.h>
#define BILLION1 (1,000,000,000)
#define BILLION2 (1000^3)
int main()
{
printf("%d, %d\n", BILLION1, BILLION2);
}
0, 1003
$
가독성을 위해서.비교를 위해 Java 지원_
가독성을 향상시키기 위한 숫자로 (Deken Colebourne이 Derek Foster의 제안: 프로젝트 코인/JSR 334에 대한 이진 리터럴에 대한 회신으로서 처음 제안함). 한 사람이 글을 쓰곤 했다.1_000_000_000
여기에
가장 오래된 지원에서 최신 지원까지 대략 시간 순서대로:
- XPL:
"(1)1111 1111"
(십진수 값이 아닌 이진수, 사분위수, 팔진수 또는 16진수 값을 나타내는 비트스트링에만 해당) - PL/M:
1$000$000
- 에이다:
1_000_000_000
- Perl:
- 루비: 마찬가지로
- 팬텀(이전의 팬): 마찬가지로
- Java 7: 마찬가지로
- 스위프트: (같은데?)
- 파이톤 3.6
- C++14:
1'000'000'000
언어가 지원해야 한다는 것을 깨닫는 것은 비교적 새로운 기능이다.추스@의 훌륭한 대답에서처럼,1000*1000...
부분적인 해결책이지만, 최종 결과가 큰 유형일지라도 프로그래머는 곱셈이 넘쳐나는 것을 버그로 여긴다.
가독성을 위해서.
사이에 (0사에에((((((((((((((((((((.1 000 000 000
또는1,000,000,000
은 ( )을 것은 문법상의 오류다.1000000000
코드에는 정확히 얼마나 많은 0이 있는지 알 수 없다.
1000*1000*1000
10^9라는 게 분명해 왜냐면 우리 눈은 더 쉽게 덩어리를 처리할 수 있거든또한, 컴파일러가 상수로 대체하기 때문에 런타임 비용도 없다.1000000000
.
더 쉽게 읽고 관련성을 찾을 수 있을 겁니다.1,000,000,000
형체를 이루다
기술적인 면에서는 직수나 곱셈은 차이가 없는 것 같아.어차피 컴파일러는 그것을 10억의 일정한 숫자로 만들어 낼 것이다.
then-c에 대한 이야기라면,1000^3
pow에 대한 그런 구문이 없기 때문에 작동하지 않을 것이다. 大신,pow()
기능을 사용할 수 있다.그러나 이 경우 최적 상태가 아닐 것이며, 컴파일러 생성 상수가 아닌 런타임 함수 호출이 될 것이다.
십진수 숫자에 대해 C에서 유사한 효과를 얻는 또 다른 방법은 문자 그대로의 부동소수 표기법을 사용하는 것이다. 즉, 두 배가 정밀도의 손실 없이 원하는 숫자를 나타낼 수 있다면 말이다.
IEEE 754 64비트 더블은 음이 아닌 정수 <= 2^53>을 문제없이 나타낼 수 있다.일반적으로 긴 더블(80비트 또는 128비트)은 그보다 더 멀리 갈 수 있다.컴파일 시간에 변환이 이루어지므로 런타임 오버헤드가 없으며 예기치 않게 정밀도가 저하되고 컴파일러가 훌륭하면 경고를 받을 가능성이 높다.
long lots_of_secs = 1e9;
참조URL: https://stackoverflow.com/questions/40633059/why-write-1-000-000-000-as-100010001000-in-c
'Programing' 카테고리의 다른 글
gwt 컴파일러의 속도를 높이려면 어떻게 해야 하는가? (0) | 2022.04.21 |
---|---|
C에서 항상 포인터를 해제할 수 없음 (0) | 2022.04.21 |
Vue 사용법.웹 팩을 사용하지 않고 끌 수 있는 CDN? (0) | 2022.04.21 |
Java를 MySQL 데이터베이스에 연결 (0) | 2022.04.21 |
Vue 및 Vuex: 상태를 변경할 때 계산된 속성이 호출되지 않음 (0) | 2022.04.20 |