programing

왜 두 정수를 나누면 부동소수점을 얻을 수 없습니까?

minimums 2023. 8. 26. 10:39
반응형

왜 두 정수를 나누면 부동소수점을 얻을 수 없습니까?

b가 부동소수인데 정수로 나누면 왜 여기서 반올림이 되는지 설명할 수 있는 사람 있나요?

#include <stdio.h>

void main() {
    int a;
    float b, c, d;
    a = 750;
    b = a / 350;
    c = 750;
    d = c / 350;
    printf("%.2f %.2f", b, d);
    // output: 2.00 2.14
}

http://codepad.org/j1pckw0y

이것은 암묵적인 변환 때문입니다.변수들b, c, d의 것입니다.float타이프. 그런데 그./연산자는 분할해야 하는 두 개의 정수를 보고 결과적으로 암묵적으로 변환되는 정수를 반환합니다.float소수점을 더해서플로트 분할을 원하는 경우 두 피연산자를/부유물다음과 같습니다.

#include <stdio.h>

int main() {
    int a;
    float b, c, d;
    a = 750;
    b = a / 350.0f;
    c = 750;
    d = c / 350;
    printf("%.2f %.2f", b, d);
    // output: 2.14 2.14
    return 0;
}

유형 주조 사용:

int main() {
    int a;
    float b, c, d;
    a = 750;
    b = a / (float)350;
    c = 750;
    d = c / (float)350;
    printf("%.2f %.2f", b, d);
    // output: 2.14 2.14
}

이를 해결하는 또 다른 방법은 다음과 같습니다.

 int main() {
        int a;
        float b, c, d;
        a = 750;
        b = a / 350.0; //if you use 'a / 350' here, 
                       //then it is a division of integers, 
                       //so the result will be an integer
        c = 750;
        d = c / 350;
        printf("%.2f %.2f", b, d);
        // output: 2.14 2.14
    }

그러나 두 경우 모두 컴파일러에게 350은 정수가 아니라 부동소수라고 말합니다.따라서 분할 결과는 정수가 아닌 부동 소수가 됩니다.

"a"는 정수이며, 정수로 나누면 정수가 됩니다.그런 다음 "b"에 정수로 할당되어 부동소수가 됩니다.

이렇게 해야 돼요.

b = a / 350.0;

구체적으로, 이것은 당신의 결과를 반올림하는 것이 아니라 0을 향해 잘라지고 있습니다.그래서 -3/2를 나누면 -2가 아니라 -1이 됩니다.적분 수학에 오신 것을 환영합니다!CPU가 부동소수점 연산을 수행하거나 수학 보조 프로세서가 등장하기 전에는 모든 것을 적분 수학으로 수행했습니다.부동소수점 연산을 위한 라이브러리가 있었지만 일반적인 용도로는 너무 비쌌기 때문에 숫자의 전체 부분에 대해 16비트 값을 사용하고 분수에 대해 또 다른 16비트 값을 사용했습니다.

편집: 제 대답은 고전적인 노인이 "내가 당신 나이였을 때"라고 말한 것을 생각나게 합니다.."

장절

6.5.5 곱셈 연산자
...
6 정수를 나누었을 때, 그 결과는 /연산자는 임의의 분수 부분이 폐기된 대수적 몫입니다. 105) 만약 그 비율이 a/b표현할 수 있습니다, 표현식 (a/b)*b + a%b같음 a그렇지 않으면, 둘 다의 행동. a/b그리고. a%b정의되지 않았습니다.

105) 이를 종종 ''0을 향한 절단''이라고 합니다.

정수를 정수로 나누면 정수 결과가 나옵니다. 1/2은 0이 됩니다. 이 결과를 부동 소수점 변수에 할당하면 0.0이 됩니다.부동 소수점 결과를 가져오려면 피연산자 중 하나 이상이 부동 소수점 유형이어야 합니다.b = a / 350.0f;당신이 원하는 결과를 제공해야 합니다.

아마도 가장 좋은 이유는0xfffffffffffffff/15당신에게 끔찍하게 잘못된 대답을 할 것입니다...

두 정수를 나누면 정수(정수) 결과가 나옵니다.

숫자 하나를 부동 소수점으로 캐스팅하거나 숫자 중 하나에 10진수(예: /350.0)를 추가해야 합니다.

언급URL : https://stackoverflow.com/questions/16221776/why-dividing-two-integers-doesnt-get-a-float

반응형