Niepoprawne mnożenie
Ostatnio zmodyfikowano 2017-10-07 13:42
Szybki_Jakub Temat założony przez niniejszego użytkownika |
Niepoprawne mnożenie » 2017-10-06 13:17:35 Witam serdecznie wszystkich. Mam taki problem z mnożeniem liczb zmiennoprzecinkowych. Podczas mnożenia niektórych liczb występują niepoprawne wyniki(np zamiast 30 to 30.0000000004) problem pojawia się w sytuacji gdy mam podane przedziały i na granicy występuje taki błąd. zamieszczam kod z przykładem. #include "stdafx.h" #include <iostream> #include <conio.h> #include <string>
std::string bmi( double w, double h );
int main() { double abc = bmi( 86.7, 1.7 ); std::cout << abc; _getch(); }
std::string bmi( double w, double h ) { double bmi = w /( h * h ); if( bmi <= 18.5 ) return "Underweight"; else if( bmi <= 25 && bmi > 18.5 ) return "Normal"; else if( bmi <= 30 && bmi > 25 ) return "Overweight"; else if( bmi > 30 ) return "Obese"; }
dla przykładu podanego (86.7, 1.7) wynik jest właśnie 30.0000000004(sprawdzony w debuggerze) zamiast 30 i zwraca "Obese" zamiast "Overweight" |
|
Anim |
» 2017-10-06 14:10:55 Wynika to z precyzji liczb zmiennoprzecinkowych.
Jest dużo artykułów w Internecie tłumaczących powody, z jakich to się dzieje.
Chociażby pierwszy z brzegu :
http://eduinf.waw.pl/inf/utils/001_2008/0119.php
:) |
|
YooSy |
» 2017-10-06 15:49:41 Zwróć uwagę do jakiego typu zmiennej próbujesz zapisać wartość zwróconą z funkcji bmi . |
|
pekfos |
» 2017-10-07 13:42:53 Typy mają ograniczenie rozmiaru. Nawet jakbyś miał ograniczenie do 1000 cyfr dziesiętnych po przecinku w notacji naukowej, co może się wydawać wystarczające do wszystkiego, ale dodaj do siebie 3 razy jedną trzecią i nie otrzymasz 1. |
|
« 1 » |