Programing

왜 1,000,000,000을 1000*1000*1000으로 C에 쓰는가?

c10106 2022. 4. 21. 19:25
반응형

왜 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^31003년 입니다. ^비트-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여기에

가장 오래된 지원에서 최신 지원까지 대략 시간 순서대로:

언어가 지원해야 한다는 것을 깨닫는 것은 비교적 새로운 기능이다.추스@의 훌륭한 대답에서처럼,1000*1000...부분적인 해결책이지만, 최종 결과가 큰 유형일지라도 프로그래머는 곱셈이 넘쳐나는 것을 버그로 여긴다.

가독성을 위해서.

사이에 (0사에에((((((((((((((((((((.1 000 000 000또는1,000,000,000은 ( )을 것은 문법상의 오류다.1000000000코드에는 정확히 얼마나 많은 0이 있는지 알 수 없다.

1000*1000*100010^9라는 게 분명해 왜냐면 우리 눈은 더 쉽게 덩어리를 처리할 수 있거든또한, 컴파일러가 상수로 대체하기 때문에 런타임 비용도 없다.1000000000.

더 쉽게 읽고 관련성을 찾을 수 있을 겁니다.1,000,000,000형체를 이루다

기술적인 면에서는 직수나 곱셈은 차이가 없는 것 같아.어차피 컴파일러는 그것을 10억의 일정한 숫자로 만들어 낼 것이다.

then-c에 대한 이야기라면,1000^3pow에 대한 그런 구문이 없기 때문에 작동하지 않을 것이다. 大신,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

반응형