Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: teele - 22.11.17 - klo:13.43

Otsikko: [ ratkaistu ] c++ ja python3 antavat eri tuloksen samalla laskukaavalla
Kirjoitti: teele - 22.11.17 - klo:13.43
 
Kokeilin sattumalta laskentalauseketta c++:lla, ja tulos oli vähän yllättävä, enkä keksi, missä teen virheen.

Pythonilla sama kaava antaa eri tuloksen ja niin myös libreofficen calcilla, joiden tulokset näyttäisivät olevan samat.

Ohjelma on tässä alla, samoin käännöskomentoni. Kaava on valitettavasti aika pitkä .... 


Koodia: [Valitse]
#include <stdlib.h>
#include<iostream>
#include<cmath>

int main()
{
  std::cout << "wwww " << (( (-297/70) * 71 + 300 ) * std::exp( (-297/70) * (-9) * 0.1 )) /  (-297/70) - 300 / (-297/70) << std::endl;
  return 1;
}

// g++ kokeilu01.cpp -Wall -pedantic  -std=c++11 -o kokeilu01

Ja sama pythonilla

Koodia: [Valitse]
>>> import math
>>> (( (-297/70) * 71 + 300 ) * math.exp( (-297/70) * (-9) * 0.1 )) /  (-297/70) - 300 / (-297/70)
84.04680881790537
>>>

Mitenhän pitäisi jompaa kumpaa koodia muuttaa, että niistä tulisi sama tulos.

Otsikko: Vs: c++ ja python3 antavat eri tuloksen samalla laskukaavalla
Kirjoitti: nm - 22.11.17 - klo:14.01
C99 ja C++11:  -297 / 70 = -4
C99 ja C++11:  -297 / 70.0 =  -4.242857142857143

C:n ja C++:n kokonaislukujaon pyöristyssääntö: "truncate towards zero"


Python 2: -297 / 70 = -5 (Python 2:ssa / on oletuksena kokonaislukujako, jos molemmat operandit ovat kokonaislukuja)
Python 3: -297 / 70 = -4.242857142857143 (Python 3:ssa / on oletuksena liukulukujako riippumatta operandeista)
Python 2 ja 3: -297 // 70 = -5
Python 2 ja 3: -297 / 70.0 = -4.242857142857143

Pythonin kokonaislukujaon pyöristyssääntö: floor (eli "round towards negative infinity")
http://python-history.blogspot.fi/2010/08/why-pythons-integer-division-floors.html


Laskutoimitus vaikuttaa siltä, että jakolaskussa pitäisi käyttää liukulukuja (297/70.0), jolloin tulos on sama molemmissa kielissä.
Otsikko: Vs: c++ ja python3 antavat eri tuloksen samalla laskukaavalla
Kirjoitti: SuperOscar - 22.11.17 - klo:14.10
Jos Pythonissa haluat suurempaa tarkkuttaa, käytä decimal-moduulia. Sen oletusasetuksin vastaus on 84.04680881790547103797379034.
Otsikko: Vs: c++ ja python3 antavat eri tuloksen samalla laskukaavalla
Kirjoitti: teele - 22.11.17 - klo:14.16
Kiitos nopeista vastauksista  :)

Liukuluvut näyttävät vaikuttavan tosiaan asiaan, en sitä itse millään keksinyt. Oikea tulos on ilmeisestikin se 84 -alkuinen.