Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Niepoprawne mnożenie

Ostatnio zmodyfikowano 2017-10-07 13:42
Autor Wiadomość
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.

C/C++
#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"


P-165476
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


:)
P-165479
YooSy
» 2017-10-06 15:49:41
Zwróć uwagę do jakiego typu zmiennej próbujesz zapisać wartość zwróconą z funkcji
bmi
.
P-165480
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.
P-165501
« 1 »
  Strona 1 z 1