2012-10-20 3 views
1

임베디드 C/C++ 환경에서 간단한 변수 조작을 시도하고 있습니다. 어떤 이유로 나는 결과적으로 제로를 일관되게 얻고 있습니다. 여기 C long 부호없는 int 번호 조작

내가 그래서 수신 번호가 내가 아는 (76)가 첫 번째 장애물 과거를 만드는 것입니다 것을 알고, 그리고

1 new power 76 
2 new power 76 
3 setduty 0 period 10000000 

를받을 출력 코드 여기

void Heater::setPower(int newpower) 
{ 
    printf("1 new power %d\n",newpower); 

    if(newpower != power) 
     power = newpower; 
    else 
     return; 

    printf("2 new power %d\n",power); 

    // Set Duty 
    long unsigned int newduty = 0; 

    // Protect from divide by zero 
    if(power <= 0) 
    { 
     printf("2.5 zeroed\n"); 
     newduty = 0; 
     power = 0; 
    } 
    else 
     newduty = period*(power/100); 

    printf("3 setduty %lu period %lu\n", newduty, period); 

    setDuty(newduty); 
} 

입니다 둘째. 그러나 어떻게 든 간단한 수학 방정식에서는 0이됩니다. "기간"은 서명되지 않은 긴 int이며 클래스 def에서 선언되지만 출력이 적절하다는 것을 알 수 있습니다.

왜이 값이 지속적으로 0이 될까요? 없어진 물건 있어요? 더 큰 숫자를 위해 특별한 것을 포함 할 필요가 있을까요? 아니면 서명되지 않은 긴 정수 나 간단한 연산자를 사용할 수 있습니까?

커널 레벨 pwm을 사용하고 있기 때문에 높은 숫자 (x < = 10,000,000)를 다루고 있습니다.

답변

6

당신이 겪고있는 문제는 power는 정수이다, 그래서 당신은 당신이 실제로는 integer division의 규칙을 0의 결과로 끝나는 것 /100 때. 즉,이를 period으로 곱하면 전체 결과는 0입니다.

당신의 정밀도 요구 사항에 따라이 power 더블 그러나 (power/100)*period는 일반적으로 소수 결과를 생성 등도 필요할 수 있습니다 이중에 결과를 저장하는 것이라는 점을 인식 할 수 있도록하기에 충분할 수있다.

((power*period)/100)으로 정수를 사용해야한다면 power*period이 큰 숫자가되기 전에 합리적으로 정확한 결과를 얻을 수 있습니다. 0. 정수 나누기를 사용하면 대괄호를 넣을 위치는 0 또는 7600000 (귀하의 경우) 사이의 차이 일 수 있습니다.

+0

나는 "newduty = (long unsigned int) period * (power/100);"처럼 사용했다. 그것이 타입 캐스팅 문제를 해결할 것이라고 생각했습니다. 이중으로 저장하고 싶지 않다. 정수를받는/sys/class/pwm에 쓰기 때문에 float이 아니어야한다. "newduty = (long unsigned int) 마침표 * (power/100.0f);" 아마도 고칠 수 있을까요? – napierzaza

+0

100을 100.0f로 만든 다음 long unsigned int로 다시 캐스팅하면 잘 작동합니다. 감사! – napierzaza

+0

@napierzaza 캐스팅 문제가 아니며 정수 문제입니다. '(76/100) <1'이기 때문에 당신의 평등에'0'을 넣습니다. 정수로 고수해야한다면'power (power * period)/100 '을 쓰면됩니다. 이것은'power * period '가 나누기 전에 큰 숫자가되기 때문에 합당한 정확한 결과를 줄 것입니다. – Benj

0

make newduty and power as double. 정수형 때문에 0을 준다.

+1

전원이 두 배가 아닌 경우에는 작동하지 않습니다. – Benj

+0

@Benj : u r right, 업데이트 됨 –

관련 문제