Kirjoittaja Aihe: [ ratkaistu ] c++ ja python3 antavat eri tuloksen samalla laskukaavalla  (Luettu 2394 kertaa)

teele

  • Käyttäjä
  • Viestejä: 852
    • Profiili
 
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.

« Viimeksi muokattu: 22.11.17 - klo:14.16 kirjoittanut teele »

nm

  • Käyttäjä
  • Viestejä: 16429
    • Profiili
Vs: c++ ja python3 antavat eri tuloksen samalla laskukaavalla
« Vastaus #1 : 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ä.
« Viimeksi muokattu: 22.11.17 - klo:14.10 kirjoittanut nm »

SuperOscar

  • Käyttäjä
  • Viestejä: 4063
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: c++ ja python3 antavat eri tuloksen samalla laskukaavalla
« Vastaus #2 : 22.11.17 - klo:14.10 »
Jos Pythonissa haluat suurempaa tarkkuttaa, käytä decimal-moduulia. Sen oletusasetuksin vastaus on 84.04680881790547103797379034.
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

teele

  • Käyttäjä
  • Viestejä: 852
    • Profiili
Vs: c++ ja python3 antavat eri tuloksen samalla laskukaavalla
« Vastaus #3 : 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.