2010-07-09 4 views
4

가능한 중복 :
Incorrect floating point math?
Float compile-time calculation not happening?C++ 이중 연산자 +

오늘 가고, 나는 그것을 잃게 해요

이상한 물건 ...

#include <iomanip> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    cout << setprecision(14); 
    cout << (1/9+1/9+4/9) << endl; 
} 

이 코드는 MSVC 9.0 x64 및 x86 및 GCC 4.4 x64 및 x86 (defa ult 옵션 및 엄격한 수학 ...). 1과 9가 정수 및 정수 부문으로 나누어 때문에 지금까지 내가 기억하는,

+3

두배는 어디에 있습니까 ??? –

+0

그리고, 내가 기억하는 한, 6/9 = 2/3! = 3/9 ... :) FTFY. –

+4

나는 정말 stuuuupiiid입니다. 나는 그것을 생각하지 않았다. grrrrrr 그것은 여기 너무 덥고, 내 뇌 기능에 좋지 않다. – rubenvb

답변

31

1/91/9+1/9+4/9 = 6/9 = 2/3 != 0제로입니다. 4/9에도 동일하게 적용됩니다.

당신이 연산 리터럴을 통해 부동 소수점 부문을 표현하려면

, 당신은 하나를 사용 부동 소수점 리터럴 1.0/9 + 1.0/9 + 4.0/9 (또는 1/9. + 1/9. + 4/9. 또는 1.f/9 + 1.f/9 + 4.f/9) 또는 명시 적으로 원하는 부동 소수점 형 (double) 1/9 + (double) 1/9 + (double) 4/9에 하나의 피연산자를 캐스팅해야합니다.

P. 마지막으로 기회 질문 :

+0

+1, 덧셈 식에있는 다른 모든 용어도 마찬가지이다. –

+2

double과 float의 이름을 지정하면 long double이라는 이름을 붙일 수 있습니다. 1L –

+1

1L은 길지 만 길지 않은 double이며 1L/3은 여전히 ​​0입니다. – 6502

4
1/9(=0)+1/9(=0)+4/9(=0) = 0 
5

그들은 모든 정수를 응답합니다. 따라서 1/9는 0입니다. 4/9도 0입니다. 그리고 0 + 0 + 0 = 0입니다. 따라서 결과는 0입니다. 분수를 원하면 분수를 부동으로 변환하십시오.

3

잘 C++ (및 많은 다른 언어들)에서 1/9+1/9+4/9은 정수 산술이기 때문에 0입니다. 당신의 숫자에 f l F L :

당신은 아마 1/9.0+1/9.0+4/9.0

6

선택적으로 이러한 접미사 중 하나를 따라 부동 소수점 연산을 강제로 계산에 소수점을 사용하여 작성합니다. 소수점이없고 그 접미사가없는 숫자 만 부동 소수점 리터럴로 간주되지 않습니다. 임의로

부동 리터럴은 정수 부분, 소수점하는 소수부, 전자 또는 E 구성

, : 플로팅 리터럴

C++ 03 2.13.3-1 부호있는 정수 지수, 및 선택적 접미사. 정수와 소수 부분 모두 은 10 진수 (숫자 10) 자릿수의 시퀀스로 구성됩니다. 정수 부분 또는 소수 부분 (둘 다 아님) 중 하나를 으로 생략 할 수 있습니다. 소수점 또는 문자 e (또는 E)와 지수 (둘 다 아님)을 생략 할 수 있습니다. 정수 부분, 선택 가능한 소수점 및 선택적 분수 부분은 플로팅리터럴의 중요한 부분을 형성합니다. 지수가있는 경우 은 중요한 부분의 배율을 10으로하는 지수입니다. 스케일링 값의 타입 표현할 수있는 값의 범위 인 경우, 결과 스케일링 값이면 가까운 표현할 밖의 큰 또는 작은 표현할 값 구현 정의 방식으로 선택된 스케일링 값 . 형식의 부동 리터럴은 접미사로 명시 적으로 지정되어 있지 않으면 double 입니다. 접미사 f 및 F는 float를 지정하고 접미사 l 및 L은 long double을 지정합니다. 크기 조정 된 값이 해당 형식의 값인 값의 범위가 아닌 이면 프로그램은 입니다.

+2

또는 많은 분수를 던지려는 경우 boost :: rational를 사용하십시오. –

2

특별히 진수를 지정하지 않는 (18), 숫자 C++ 사용, 그래서 1/9 = 4/9 = 00 + 0 + 0 = 0 정수입니다.

당신은 단순히 유형의 C 규칙에 의해 소수 1.0 등 ...

2

추가해야합니다, 당신은이 모든 정수 수학을하고 있어요. 1/9와 4/9는 모두 0으로 잘립니다 (정수로). 1.0/9.0 등을 쓴 경우 배정도 수학을 사용하고 원하는 것을 수행합니다.

-2

더 많은 괄호를 사용하는 습관을 만들 수 있습니다. 시간이 거의 들지 않고 자신이 원하는 것을 분명히하고 원하는 것을 얻을 수 있도록하십시오. 글쎄요 ...;)

+2

게시 된 표현의 괄호는이를 어수선하게하여 완전히 읽을 수없는 가독성을 줄입니다. 그들은 손에있는 문제와 관련이 없으며 괄호 삽입은 포스터의 질문에 답하지 않습니다. – sigfpe

+1

나는 완전히 동의하지 않습니다. 괄호를 추가하여 평가 순서를 지정하면 모호성이 제거되고 미묘한 오류가 방지 될 수 있습니다. 나는 괄호로 묶어 두어 코드를 읽을 수 없게 만들 것이라고 믿기 어렵다. 나는 또한 소스 코드의 가독성을 작동하는 코드보다 중요하게 생각하는 것에 동의 할 수 없다. – Jay