Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: 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ä ....
#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
>>> 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.
-
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ä.
-
Jos Pythonissa haluat suurempaa tarkkuttaa, käytä decimal-moduulia. Sen oletusasetuksin vastaus on 84.04680881790547103797379034.
-
Kiitos nopeista vastauksista :)
Liukuluvut näyttävät vaikuttavan tosiaan asiaan, en sitä itse millään keksinyt. Oikea tulos on ilmeisestikin se 84 -alkuinen.