2011-07-17 2 views
4

내가 이것에 대해 매우 혼란 스러워요 이유는 ... 여기 내 코드에서 추출이 이해가 안 ..수레는 C에서 반올림되고 ++ 및

float m = 0.0, c = 0.0; 
printf("toprightx = %d bottomrightx = %d toprighty = %d bottomrighty = %d\n", 
    toprightx, bottomrightx, toprighty, bottomrighty); 
// find m and c for symmetry line 
if (toprightx == bottomrightx) { 
    m = (-toprighty + bottomrighty); 
} 
else { 
    m = (-toprighty + bottomrighty)/(toprightx - bottomrightx); 
} 

c = -toprighty - (m * toprightx); 

printf("m = %f and c = %f\n", m, c); 

을 그리고 여기에 출력됩니다 :

toprightx = 241 bottomrightx = 279 toprighty = 174 bottomrighty = 321 
m = -3.000000 and c = 549.000000 

왜 출력이 반올림됩니까? 나는 왜 코드가 정수를 반환하는지 이해하지 못하기 때문에 그것들을 수레라고 선언했다. m의 올바른 값은 -3.8684이어야합니다.

(즉 toprightx, bottomrightx, toprighty, bottomrighty 주 더 코드의 최대 정수로 선언되었다.) C++ 그들을 위해 정수 계산을 사용합니다, 그래서 당신이 당신의 계산에만 INT의의를 사용하고 있기 때문이다

+5

클래식 ........ – Mehrdad

+1

을하고 결과를 거즈 : 대신 시도 부유물에. 다른 변수를 수레로 정의해야합니다. –

+0

'toprightx, bottomrightx'가 다른 이유는 무엇입니까? 'toprightx'가 적다면 'topleftx'[아니면 그냥 'left']가되어서는 안됩니까? – Random832

답변

14

toprightx, bottomrightx, toprighty, bottomrighty는 코드에서 정수로 더 이상 선언 된 입니다.

답변이 있습니다. 정수 만 포함하는 계산은 나누기를 포함하여 정수 수학에서 수행됩니다. 결과가 float에 할당된다는 것은 중요하지 않습니다.

이 문제를 해결하려면 x/y 값 중 하나 이상을 float로 선언하거나 계산에서 float으로 캐스팅하십시오.

3

. float에 int 변수 중 하나를 캐스팅하면 좋을 것입니다.

이 문을 m = (-toprighty + bottomrighty)/(toprightx - bottomrightx);에서 m = (-toprighty + bottomrighty)/(float)(toprightx - bottomrightx);으로 변경하면됩니다.

7

이 라인 정수 나눗셈을 수행 : topright, bottomrighty, toprightx 모든 정수 bottomrightx, 즉 수학 식의 결과는 정수이어야한다

(-toprighty + bottomrighty)/(toprightx - bottomrightx); 

입니다. equaition이 정수를 계산 한 후 float에 할당합니다. bottomrighty 수레로,

(-toprighty + bottomrighty + 0.0)/(toprightx - bottomrightx); 
2

선언 toprightx, bottomrightx, toprighty 또는 혼합 연산을 요청하기 전에 수레 그들을 캐스트 :이 대신 같은 것을 할 수

float m = -3;

: 그것은 동일합니다. (당신이하고있는 바와 같이, 암시 적으로) 데이터를 자릅니다 int로

m = (-toprighty + bottomrighty)/(float)(toprightx - bottomrightx); 
1

소수점 연산 부동 사용하는 부서를 강제로, 부동 소수점 수에 제수를 전송 해 봅니다 그것은 새로운 유형에 적합하지 않습니다.

데이터가 반올림되지 않고 잘려 나간다는 점에 유의하십시오.

+0

분자 또는 분모 중 하나만 캐스팅하려는 경우 분자를 캐스팅하는 것이 훨씬 좋습니다. 왜 그 캐스팅을 인간의 독자로부터 숨길 수 있습니까? –

5

여기 당신을 위해 시간 int입니다 :

m = (-toprighty + bottomrighty)/(toprightx - bottomrightx); 
     ^int  ^int    ^int  ^int 

그 작업의 모든 (부동 소수점을 절단) 정수 나누기를 사용하여 수행하고 float으로 캐스팅됩니다. 나는 C 프로그래머가 아니에요,하지만 난 그것 (때문에 사용되는 변수) 첫 번째 정수 연산을 수행 확신

m = float(-toprighty + bottomrighty)/(toprightx - bottomrightx); 
+2

+1을 h'int'에, 그리고 분자에 캐스트를 사용합니다. 분모에 대한 캐스트도 작동하지만 코드가 사람의 판독기에 숨겨져 있습니다. 분자를 캐스팅하면 캐주얼 리더에게도 부동 소수점 결과가 필요하다는 것이 뻔뻔스럽게 드러납니다. –

관련 문제