Rätzelhafte Rundungsfehler...

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Firstdeathmaker

Betreff: Rätzelhafte Rundungsfehler...

BeitragDo, Jul 05, 2007 10:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wusste ja schon vorher das BB und BMax so ihre Schwierigkeiten mit dem Runden haben, aber das es so extrem ist?

Ich möchte einfach nur die Zahlen 2,4,8,16,32 etc. ausgeben, aber schon bei 2^3 gibt er mir, wenn ich mit i:int hochzähle, nicht 8, sondern 7 aus.
Lösungen?


Code: [AUSKLAPPEN]
Rem
1. Frage: Warum kommt bei 2 ^ i [i = 3]
   nicht 8 sondern 7.9999999999999982 heraus?
2. Frage: Warum rundet der 7.9999999999999982 auf 7 runter?
End Rem


For i:Int = 1 To 3
   Print 2^i
   Print Int(2^i)
Next


Rem
[OUTPUT]
Building BMaxFragen
Compiling:BMaxFragen.bmx
flat assembler  version 1.64
3 passes, 2690 bytes.
Linking:BMaxFragen.debug.exe
Executing:BMaxFragen.debug.exe
2.0000000000000000
2
4.0000000000000000
4
7.9999999999999982
7

Process complete
[/OUTPUT]
end rem
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

mahe

BeitragDo, Jul 05, 2007 10:52
Antworten mit Zitat
Benutzer-Profile anzeigen
BMax hat keine Probleme beim Runden. Es Rundet bei Int() einfach immer ab. Man muss nur wissen, dass es so ist.

So stimmts:
Code: [AUSKLAPPEN]
For i:Int = 1 To 3
   Print 2^i
   Print Int(2^i+0.5)
Next
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ,

Firstdeathmaker

BeitragDo, Jul 05, 2007 10:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist trotzdem blöde, weil ich nach einem 2^3 eine 8 erwarte, und keine 7!
Ist in meinen Augen ein ganz schwerer Fehler.

Und fürs Abrunden ist doch Floor zuständig, nicht INT. Int sollte doch, wie bei BB, zum nächstliegenden Auf/Abrunden. Wozu braucht man sonst noch Floor?

Ich meine, klar kann man das Problem umschiffen indem man da rumfrickelt (aber ich würde nicht 0.5 Addieren, das ist dann schon sehr hässlich, sondern Ceil)
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

FOODy

BeitragDo, Jul 05, 2007 11:13
Antworten mit Zitat
Benutzer-Profile anzeigen
@Frage 1:
Es wurde schon oft von Dreamora erwähnt: Es liegt an der veralteten MinGW version.

Wenn du kein MaxGUI hast, müsste die aktuellste gehen.

Gruß,
FOODy

EDIT:
Frage 1: http://blitzbasic.com/Communit...opic=70236
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
  • Zuletzt bearbeitet von FOODy am Do, Jul 05, 2007 12:07, insgesamt 2-mal bearbeitet

mahe

BeitragDo, Jul 05, 2007 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Es steht sogar in der Doku dass INT immer Richtung Null rundet:

Zitat:
the following values all print 0 as BlitzMax "rounds to zero"
' when converting from floating point to integer

a=0.1;Print a
a=0.9;Print a
a=-0.1;Print a
a=-0.9;Print a
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ,

TheShadow

Moderator

BeitragDo, Jul 05, 2007 12:11
Antworten mit Zitat
Benutzer-Profile anzeigen
MinGW hat nix damit zu tun... So ist INT in BlitzMax... aber ich meine in C++ ist es auch so (?)

^ ist ein Double-Operator

Zitat:
Ich möchte einfach nur die Zahlen 2,4,8,16,32 etc. ausgeben


dann mach z.B. so

for i=1 to 16
PRINT 1 SHL i
next
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2
 

Dreamora

BeitragDo, Jul 05, 2007 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Int rundet garnet. Es schneidet einfach alles nach dem 0 ab und das kommt daher, dass das das C Verhalten ist und BM auf C Mathe Modulen basiert Smile

(Blitz3D und BlitzPlus hatten da als einzige mir bekannte Sprachen das kaputte Verhalten das es mathematisch gerundet hat bei Int(..)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group