Division in C++ funktioniert nicht wie erwartet

Lesezeit: 3 Minuten

Ich habe an etwas anderem gearbeitet, aber alles kam als Null heraus, also habe ich dieses minimalistische Beispiel gemacht, und die Ausgabe ist immer noch 0.

#include <iostream>

int main(int argc, char** argv)
{
  double f=3/5;
  std::cout << f;
  return 0;
}

Was vermisse ich?

Sie übersehen die Tatsache, dass 3 und 5 ganze Zahlen sind, also erhalten Sie eine ganzzahlige Division. Um den Compiler dazu zu bringen, eine Gleitkommadivision durchzuführen, machen Sie eine davon zu einer reellen Zahl:

 double f = 3.0 / 5;

Das tut es nicht brauchen zu sein .0kannst du auch machen 3./5 oder 3/5. oder 3e+0 / 5 oder 3 / 5e-0 oder 0xCp-2 / 5 oder … Es muss nur ein Indikator vorhanden sein, damit der Compiler weiß, dass er die Division als Fließkomma ausführen soll.

Andere Möglichkeit: double f=double(3)/5. Das ist viel mehr Tippen, aber es lässt keinen Zweifel daran, was Sie tun.

Oder einfach verwenden double f=.6das geht auch…

Versuche dies:

double f = 3.0/5.0;

dies sollte Ihr Problem beheben

Versuchen Sie, a zu setzen .0 nach einem der Teiler. Dadurch werden sie in Gleitkommaliterale umgewandelt.

Sie verwenden ganze Zahlen. Sie können viele Dinge tun, um Ihre Konstanten wie leftaround-Zustände zu verdoppeln, aber das ist nicht gut, sauber, gut. Es ist schwer zu lesen und verwirrend. Wenn Sie 3 und 5 wollen, machen Sie daraus 3.0 und 5.0. Jeder wird wissen, was Sie meinen, wenn er gezwungen wird, Ihren Code zu lesen. Vieles von dem, was er/sie sagt, erfordert wirklich, dass Sie C/C++ kennen und wissen, wie Floats Speicher sind, um Kopf oder Zahl zu bilden.

  • Nun, ich dachte, das sei offensichtlich 0xCp-2 / 5 war nicht wirklich ernst zu nehmen! …Aber was die Verwendung von 3.0 angeht: Das ist Geschmackssache. Ich persönlich hasse es, es so zu schreiben, weil in der Wissenschaft jede endliche Anzahl von Stellen nach dem Komma auf eine Art Ungenauigkeit in gemessenen Werten usw. hindeutet. Wenn ich also 3,0 sehe, denke ich immer an 3±0,05 und 3,0/ 5,0 ist 0,6 ± 0,01 für mich. Das ist keine doppelte Genauigkeit! ich bevorzuge 3./5.

    – linksherum

    23. Mai 2011 um 23:03 Uhr

  • Der ganze Sinn meines Posts war es, das Lesen zu erleichtern. 3./5 sieht nicht wie eine standardmäßige mathematische Gleichung aus. Sie müssen Ihr Publikum kennen: Ich glaube nicht, dass das Poster (wenn es Probleme mit dem Unterschied zwischen Real und Int hat) für hochrangige wissenschaftliche Anwendungen programmiert ist, also würde ich denken, je einfacher, desto besser.

    – Joe Tymann

    23. Mai 2011 um 23:24 Uhr

Benutzer-Avatar
Farid Alijani

Für den Fall, dass Sie Ihre generischen Variablen mit speichern int und möchte das Verhältnis als erhalten double:

using namespace std;
int main()
{
   int x = 7;
   int y = 4;
   double ratio;
   ratio = static_cast<double>(x)/static_cast<double>(y);
   cout << "ratio =\t"<<ratio<< endl;
}

  • Nun, ich dachte, das sei offensichtlich 0xCp-2 / 5 war nicht wirklich ernst zu nehmen! …Aber was die Verwendung von 3.0 angeht: Das ist Geschmackssache. Ich persönlich hasse es, es so zu schreiben, weil in der Wissenschaft jede endliche Anzahl von Stellen nach dem Komma auf eine Art Ungenauigkeit in gemessenen Werten usw. hindeutet. Wenn ich also 3,0 sehe, denke ich immer an 3±0,05 und 3,0/ 5,0 ist 0,6 ± 0,01 für mich. Das ist keine doppelte Genauigkeit! ich bevorzuge 3./5.

    – linksherum

    23. Mai 2011 um 23:03 Uhr

  • Der ganze Sinn meines Posts war es, das Lesen zu erleichtern. 3./5 sieht nicht wie eine standardmäßige mathematische Gleichung aus. Sie müssen Ihr Publikum kennen: Ich glaube nicht, dass das Poster (wenn es Probleme mit dem Unterschied zwischen Real und Int hat) für hochrangige wissenschaftliche Anwendungen programmiert ist, also würde ich denken, je einfacher, desto besser.

    – Joe Tymann

    23. Mai 2011 um 23:24 Uhr

1013300cookie-checkDivision in C++ funktioniert nicht wie erwartet

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

Privacy policy