Warum wird beim Teilen zweier Ganzzahlen kein Gleitkommawert ausgegeben? [duplicate]

Lesezeit: 4 Minuten

Kann jemand erklären, warum b hier abgerundet wird, wenn ich es durch eine ganze Zahl dividiere, obwohl es ein Float ist?

#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

  • “Warum?” – Weil die Sprache so gestaltet wurde. Wenn Sie möchten floatwirfst du zu a float Erste.

    – Mystisch

    25. April 2013 um 18:13 Uhr

  • Nur weil die linke Seite einer Zuweisung ein Float ist, bedeutet das nicht, dass die rechte Seite es sein muss – es bedeutet nur, dass die rechte Seite anbieten muss gleicher oder geringerer Genauigkeit dass ein Float, daher hat der Compiler keinen Grund, etwas anderes als int zu machen.

    – Annäherung an DarknessFish

    25. April 2013 um 18:14 Uhr

  • Da a und 350 sind ints.

    – Daniel Fischer

    25. April 2013 um 18:15 Uhr

  • Denn so haben es Kernighan und Ritchie definiert.

    – Heiße Licks

    25. April 2013 um 18:27 Uhr

  • @ValekHalfHeart “gleiche oder geringere Genauigkeit” hat nichts damit zu tun. int i = 2.0; und double d = 1; sind beide gültig, unabhängig von Ihrer Definition von „Präzision“.

    – Pascal Cuoq

    25. April 2013 um 18:34 Uhr

Benutzeravatar von Sukrit Kalra
Sukrit Kalra

Dies liegt an der impliziten Konvertierung. Die Variablen b, c, d sind aus float Typ. Aber die / Der Operator sieht zwei ganze Zahlen, die er dividieren muss, und gibt daher eine ganze Zahl im Ergebnis zurück, die implizit in a konvertiert wird float durch das Hinzufügen eines Dezimalpunktes. Wenn Sie Gleitkomma-Divisionen wünschen, versuchen Sie, die beiden Operanden zu machen / schwimmt. Wie folgt.

#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;
}

Benutzeravatar von Cacho Santa
Cache Santa

Verwenden Gießen von Typen:

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
}

Dies ist eine andere Möglichkeit, das zu lösen:

 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
    }

In beiden Fällen teilen Sie dem Compiler jedoch mit, dass 350 ein Gleitkommawert und keine Ganzzahl ist. Folglich ist das Ergebnis der Division ein Gleitkommawert und keine Ganzzahl.

  • Würde dies zum selben Ergebnis führen? b = (float) a / 350;

    – Pilz

    25. April 2013 um 18:16 Uhr


  • Ja es würde. Sie müssen einen in a umwandeln float.

    – Sukrit Kalra

    25. April 2013 um 18:18 Uhr

  • Eigentlich, 350.0 ist ein doubleund das Ergebnis der Operation wäre a double das wird dann umgewandelt float für den Auftrag. 350.0f wäre ein float.

    – Daniel Fischer

    25. April 2013 um 18:18 Uhr


  • @DanielFischer Danke für die Klarstellung. Was ist eigentlich der Unterschied zwischen einem Double und einem Float?

    – Pilz

    25. April 2013 um 18:21 Uhr

  • @jon Die Reichweite und Genauigkeit der Typen. Sie kann gleich sein, aber normalerweise a float ist ein 32-Bit-Typ mit 24 Bit Genauigkeit, die größte endliche Zahl, die gespeichert werden kann, ist 3,4028235e38, die kleinste positive Zahl 1,0e-45, während double ist ein 64-Bit-Typ mit 53 Bit Genauigkeit, der Zahlen bis zu 1,7976931348623157e308 und so klein wie 5,0e-324 speichern kann.

    – Daniel Fischer

    25. April 2013 um 18:27 Uhr

“a” ist eine ganze Zahl, wenn es durch eine ganze Zahl geteilt wird, gibt es eine ganze Zahl. Dann wird es “b” als Integer zugewiesen und wird zu einem Float.

Du solltest es so machen

b = a / 350.0;

Insbesondere rundet dies Ihr Ergebnis nicht, sondern schneidet in Richtung Null ab. Wenn Sie also -3/2 teilen, erhalten Sie -1 und nicht -2. Willkommen in der integralen Mathematik! Bevor CPUs Gleitkommaoperationen ausführen konnten oder mathematische Koprozessoren aufkamen, haben wir alles mit integraler Mathematik gemacht. Obwohl es Bibliotheken für Gleitkomma-Mathematik gab, waren sie (in CPU-Befehlen) für allgemeine Zwecke zu teuer, also verwendeten wir einen 16-Bit-Wert für den ganzen Teil einer Zahl und einen weiteren 16-Bit-Wert für den Bruch.

BEARBEITEN: Meine Antwort lässt mich an den klassischen alten Mann denken, der sagt: “Als ich in deinem Alter war …”

Kapitel und Vers

6.5.5 Multiplikative Operatoren


6 Wenn ganze Zahlen dividiert werden, ist das Ergebnis der / Operator ist der algebraische Quotient, wobei jeder Bruchteil verworfen wird.105) Wenn der Quotient a/b darstellbar ist, der Ausdruck
(a/b)*b + a%b soll gleich sein a; ansonsten das Verhalten von beiden a/b und a%b ist undefiniert.


105) Dies wird oft als „Abschneiden in Richtung Null“ bezeichnet.

Die Division einer ganzen Zahl durch eine ganze Zahl ergibt ein ganzzahliges Ergebnis. 1/2 ergibt 0; Wenn Sie dieses Ergebnis einer Fließkommavariablen zuweisen, erhalten Sie 0,0. Um ein Gleitkommaergebnis zu erhalten, muss mindestens einer der Operanden ein Gleitkommatyp sein. b = a / 350.0f; sollte Ihnen das gewünschte Ergebnis liefern.

R.. GitHub STOP HELPING ICEs Benutzeravatar
R.. GitHub HÖREN SIE AUF, ICE ZU HELFEN

Der wahrscheinlich beste Grund ist, weil 0xfffffffffffffff/15 würde dir eine schrecklich falsche antwort geben…

Benutzeravatar von kyle_13
kyle_13

Die Division zweier ganzer Zahlen führt zu einem ganzzahligen Ergebnis.

Sie müssen eine Zahl als Gleitkommazahl umwandeln oder eine Dezimalzahl zu einer der Zahlen hinzufügen, z. B. a/350,0.

1389690cookie-checkWarum wird beim Teilen zweier Ganzzahlen kein Gleitkommawert ausgegeben? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy