Toon posts:

[JS] Bizarre Floating point errors

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ehhh...ik wist wel dat JavaScript loosely typed was...maar dan wil ik toch eigenlijk wel dat 'ie redelijk nauwkeurig met floating points om gaat...niet dus |:(
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<html>
<head>
    <title>JavaScript floating point error</title>
</head>
<script type="text/javascript">
<!--

var the_float = 0;  // Start bij 0
//--------------------------------------------------
function updateFloat() {
//--------------------------------------------------
    if(the_float >= 1) alert(the_float + ' != 1');
    else {
        document.write(the_float + '<br>');
        the_float += 0.1;   // Tel er 0.1 bij op
        updateFloat();
    }   
}
updateFloat();

//-->
</script>
<body>


</body>
</html>

Ik daag jullie uit om deze code te draaien. Als er iemand van jullie een fatsoenlijk lijstje uit krijgt zou ik graag willen weten met welke browser/OS. Het is mij nog niet gelukt ;(

/me vind JavaScript plotseling iets te loosely typed

  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 19-08 19:06
Dit komt toch voort uit de binaire representaties van de floats die nooit precies zijn. Is bij meerdere talen een probleem als ik me niet vergis.

Verwijderd

Denk dat het met Konqueror het beste gaat.

tot 0.7 gaat ie goed en dan krijg je:

0.7999999999999999
0.8999999999999999
0.9999999999999999

en dan de window.alert.

Bij Mozilla en IE 5.1 Mac gaat het al sneller fout:

0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Dit komt idd doordat floats binair worden opgeslagen.. Bedenk wel dat de afwijking slechts 0.000000000000001 is en in vergelijking met je 0.1 behoorlijk buiten de significantie valt.

Om ff aan te geven hoe klein dit getal is:

Als dit een kans was dat je in 1 jaar de hoofdprijs in een loterij zou winnen, dan zou waneer iedereen op de wereld mee zou doen, 1x in de 20.000 jaar de hoofdprijs vallen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Willem
  • Registratie: Februari 2001
  • Laatst online: 01-09 23:01
code:
1
2
3
4
5
6
7
8
9
10
11
0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999

En dan een alert met een waarde van 1. ?? xx

dus :)

/edit
WinXP, IE6

Is this any helpful ?

Motor (of auto) onderhoud bijhouden


  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 16:38

Pelle

🚴‍♂️

Heb ik ook wel eens gehad; is te omzeilen door the_float eerst met 10 te vermenigvuldigen, er 1 bij op te tellen (0.1 * 10) en daarna weer te delen door 10.

code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<html>
<head>
    <title>JS floating point workaround</title>
</head>
<script type="text/javascript">
<!--
var the_float = 0;  // Start bij 0
//--------------------------------------------------
function updateFloat() {
//--------------------------------------------------
    if(the_float >= 1) alert(the_float + ' != 1');
    else {
        document.write(the_float + '<br>');
        the_float = (the_float * 10) + 1;
        the_float = the_float / 10; 
        updateFloat();
    }   
}
updateFloat();

//-->
</script>
<body>


</body>
</html>

output:
code:
1
2
3
4
5
6
7
8
9
10
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 31-08 12:55
Mmmz, als het met bitwise te maken had zou je toch verwachten dat bitwise operators het goed deden maar:

the_float = 0; // Start bij 0
//--------------------------------------------------
function updateFloat() {
//--------------------------------------------------
//XOR met zichzelf, moet altijd 0 geven right?
if(the_float^the_float == 0)
alert("Hey the_float now is: " + the_float);
if(the_float <= 1)
{
document.write(the_float + '<br>');
the_float += 0.1; // Tel er 0.1 bij op
updateFloat();
}
}
updateFloat();

geeft nog steeds kromme resultaten...

Blijft vaag.

  • cutter
  • Registratie: November 2000
  • Laatst online: 28-09-2025

cutter

Wannabe i7 fanboy

Vanwaar deze kick?? Ik waarschuw maar even dat jullie niet gaan reageren op berichten van een maand oud. Reageer maar op de kicker.
Pagina: 1