Większość języków programowania, które nie są kompilowane, lub są kompilowane Just In Time interpretuje float jako double, ponieważ użycie floata jest obarczone dużym błędem i wie to każdy, kto choć trochę interesował się algorytmiką. W C/C++ używanie floata jest wysoce niezalecane w przypadku ważnych obliczeń.
@n1troo tez tak na poczatku podchodzilem. Uwierz mi ze za rok bedziesz dluzszy swoj kod na nowo analizowal i sobie probowal przypomniec o co ci chodzilo.
Serio?! Co, jutro dla "programistów 15k" będzie "jak obliczyć poprawnie wartość pierwiastka drugiego stopnia"? Serio?! Przecież to są podstawy podstaw, myślę że ktokolwiek kto myślał choć trochę poważniej na temat programowania powinien to już dawno wiedzieć...
Kolejna propozycja. Może pokażmy programistom15k też, że:
unsigned int a = UINT_MAX; a += 1; assert(a == 0); assert(UINT_MAX == -1); bo to jakaś tajemna wiedza...
@WykopowyProgramista15k: Ale zdajesz sobie sprawę, że w C i C++ overflow zmiennych to undefined behaviour i wcale nie jest pewne, że to zadziała tak jak sądzisz? ;)
@MrMann: PS. Dziwne, bo u mnie jednak się "reprodukuje" błąd. Nie na oryginalnym przykładzie, bo nawet mi się tego czytać nie chce, ale kod sklejony na szybko:
Widać, że w przypadku dużej ilości operacji zmiennoprzecinkowych błąd (mały bo mały, ale się kumuluje). Nie mam pojęcia jakie są detale implementacyjne JavaScriptu i nie chcę w to wchodzić, jednak problem jak najbardziej występuje w JS i założę się, że w Pythonie też.
@Flypho: no to sprawdź jeszcze czas akumulacji miliona floatów. 125 milisekund to mało?
No zależy. Czasem kilkaset razy za dużo. W przetwarzaniu kanału radiowego LTE w ciągu jednej milisekundy musisz wykonać kilkanaście milionów takich obliczeń. Kiedy milisekunda mija, jest już za późno na podanie jakiegokolwiek wyniku, zaczyna się następna ramka radiowa, a Mati który chciał obejrzeć smiesznypiesek.gif, będzie musiał poczekać następne 4 ramki na retransmisje tej porcji danych, której nie zdążyłeś
@RobotKuchenny9000: Python nie jest kompilowany do kodu maszynowego tylko interpretowany, dlatego może miec mechnizmy korekcyjne, które pozwalają nie przejmować się takimi rzeczami, ale za to zmniejszają wydajność programu.
almost all platforms map Python floats to IEEE-754 “double precision”
Z artykułu:
Wiele osób pewno zauważy, że w omawianych przykładach problem mogliśmy też ominąć po prostu przechodząc z obliczeniami na liczby o podwójnej precyzji, czyli typ double.
Komentarze (229)
najlepsze
using System;
using System.Linq;
public class Program
{
public static void Main()
{
float f = 0.53125f;
float sum = 0;
sum = Enumerable.Sum(Enumerable.Repeat(f, 1000000));
Console.WriteLine(sum);
}
}
zrobiłem test. Można śmiało za pomocą LINQ sumować
Kolejna propozycja. Może pokażmy programistom15k też, że:
unsigned int a = UINT_MAX;
a += 1;
assert(a == 0);
assert(UINT_MAX == -1);
bo to jakaś tajemna wiedza...
https://jsfiddle.net/d51wbc8k/
Widać, że w przypadku dużej ilości operacji zmiennoprzecinkowych błąd (mały bo mały, ale się kumuluje). Nie mam pojęcia jakie są detale implementacyjne JavaScriptu i nie chcę w to wchodzić, jednak problem jak najbardziej występuje w JS i założę się, że w Pythonie też.
No zależy. Czasem kilkaset razy za dużo. W przetwarzaniu kanału radiowego LTE w ciągu jednej milisekundy musisz wykonać kilkanaście milionów takich obliczeń. Kiedy milisekunda mija, jest już za późno na podanie jakiegokolwiek wyniku, zaczyna się następna ramka radiowa, a Mati który chciał obejrzeć smiesznypiesek.gif, będzie musiał poczekać następne 4 ramki na retransmisje tej porcji danych, której nie zdążyłeś
Dziwnę albo robię coś źle albo Python to król ᕦ(òóˇ)ᕤ
Z artykułu: