@Uszy_bobaka: ale po cholerę koło rewynajdywać? from decimal import *, i używać jako floata. Nie ma problemu z zakresem, nie ma problemu kumulacji błedu zmiennoprzecinkowego.
@tamtokontojuzusunalem: Kurna racja pomroczność jasna, za dużo mi tych pozycji dziesiętnych wychodziło, ale nie sprawdzałem, bo cyfry znaczące się zgadzały... Coś tam wcześniej wcześniej kombinowałem i te ekstra '0' zostały >(
A wynik -> float(str(total)[:-1022]+'.'+str(total)[-1022:]) i heja - będzie Overflow albo nie będzie.
To jest taki mały dowód na to, że nie ma idealnego programu. Analiza błędu doprowadziła do wydania poprawki. Tak jest w przypadku każdego systemu, czy finansowego, operacyjnego, czy bazodanowego. Może taka luka nie pozwoli na przejęcie kontroli nad systemem, chociaż kto wie? Nie da się przeanalizować każdego przypadku.
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ś
Komentarze (229)
najlepsze
To samo tyczy się MySQL gdzie nawet nie ma money.
@ShadowDancer bo wolałes z pytaniem. Dużo na ten temat jest na stackoverflow gdzie będą odniesienia i dokładne wyjaśnienia.
from decimal import *
, i używać jako floata. Nie ma problemu z zakresem, nie ma problemu kumulacji błedu zmiennoprzecinkowego.https://docs.python.org/3/library/decimal.html
A wynik ->
float(str(total)[:-1022]+'.'+str(total)[-1022:])
i heja - będzie Overflow albo nie będzie.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ś