2

암시 적으로 부동 소수로 계산되도록 지시문 또는 매개 변수가있는 컴파일러가 있습니까? 예를 들어 계산의 정수 (1, 3, 10)은 정수이기 때문에암시 적 캐스팅 C++에서 부동 소수점 연산을 수행 할 정수 계산

float f = (1/3)*5; 
cout << f; 

은 "F", "0"이다. 컴파일러 지시문이나 매개 변수로 정수 계산을 변환하고 싶습니다.

float f = ((float)1/3)*5; 

또는

float f = (1.0f/3.0f)*5.0f; 

당신이이 과정을 수행하는 모든 매개 변수가있는 C/C++ 컴파일러를 아십니까 : 나는 명시 적 캐스팅 나 같은 ".F"접두어를 사용하지 않습니다 의미 명시 적 주조 나 ".f"것없이?

+7

기본 언어의 의미를 변경할 수 있습니다. 일반적으로 좋은 생각이 아닙니다. 어쩌면 당신의 취향에 맞는 int/float 식에 대한 의미론을 가진 완전히 다른 프로그래밍 언어로 더 행복할까요? –

+1

BTW : 두 번째 경우에는 '1'과 '3'중 하나만 부동 상태 여야합니다. 다른 상수와 '5'는 자동으로 승격됩니다. 또한 그들을 float로 정의 할 필요가 없으며, double은 암시 적으로 float으로 강등됩니다. float f = (1.0/3) * 5'는 트릭을 만듭니다 (또는 '5.0/3'). –

+1

@David : "5가 자동으로 승격됩니다."int보다 작은 정수 상수가 int로 변환되면 "승격 됨"이라고 말하지만 다른 모든 경우에는 "변환 된"이라고 말합니다. –

답변

1

언급 한 두 가지 방법이 마음에 들지 않는다면 운이 좋지 않을 것입니다.

이것으로 무엇을 달성하기를 원하십니까? "float-division"을 수행 한 모든 특수 연산자는 토큰 화 이후에 int를 부동 소수점으로 변환해야하므로 실행에 대한 성능 이점을 얻지는 못합니다.

+0

답변 해 주셔서 감사합니다.하지만 문제를 좋아하거나 싫어하는 것이 아닙니다. 우리 프로젝트는 거대하며 정수 연산에는 관심이 없습니다. 우리는 실수로 실수를 할 수 있습니다.따라서 모든 코드가 저장소에 제출 된 후에 정수 상수를 부동 소수점 상수 (.f)로 변환하는 매크로를 실행해야합니다. 우리 대신이 작업을 수행하는 컴파일러가 있다면 프로젝트 구축의 단계 (매크로 실행)를 제거 할 수 있습니다. – Ziddiri

+1

@Ziddiri - 코드에 정수 상수가 필요 없다고 생각한다면 나중에 저장소가 아닌 *로 커밋하기 전에 체크를 실행하는 것이 더 합리적이라고 생각했을 것입니다. 정수 리터럴을 사용하는 경우 코드를 거부합니다 (또는 프로그래머에게 경고). 물론 대부분의 사용은 해가되지 않습니다. 'float f = 1; f + = 5; f = 1/f;'. 단지 가끔 잘못되었으므로 정수 리터럴을 사용하지 않는 한 실수를하기 쉽습니다. 그래서, 항상'float f = 1.0; f + = 5.0; f = 1.0/f;'그리고'f * = (3/2);와 같은 잘못된 코드는 틀리게 보일 것입니다. –

+3

프로젝트가 단일 int를 사용하지 않습니까? for 루프조차도? –

0

아니요, 그 두 가지 옵션이 가장 좋았습니다.

2

C++에서는 코드를 통해 여러 개의 수치 값을 표시하는 것이 이상합니다. 일반적으로 이러한 '마법 수'를 정적 정적 부동 소수점 값으로 이동하면이 문제를 제거하는 것이 가장 좋습니다.

+0

동일한 방법을 C#에 적용 할 수 있고 적용해야합니다. – kenny

2

원하는 것을 수행 한 모든 컴파일러는 더 이상 적합한 C++ 컴파일러가 아닙니다. 정수 나누기의 의미는 (적어도 양수의 경우) 잘 지정되어 있으며이를 변경하려고합니다.

또한 모든 것에 적용되기 때문에 위험 할 수 있습니다. 그리고 표준 정수 연산에 의존하는 코드가있을 수도 있습니다. 자동으로 무효화됩니다. 어쨌든 그걸 잡을 수있는 테스트가 있었다면 아마 원하지 않는 정수 연산을 잡을 수있는 테스트를했을 것입니다.

그래서 단 하나의 테스트를 작성하고 코드 리뷰를 작성하고, 매직 넘버를 피하려고합니다 (대신 const float으로 정의).