[C] Was genau macht lrintf()?

SvenF311

doesn't like
ID: 151941
L
24 April 2006
307
61
Hallo Leute

Da sich mein MSVC2003 von Gottes Gnaden mit der lrintf() Funktion leider etwas schwer tut und ich ATM zu faul bin, um einen C99-tauglichen Compiler zu installieren, bräuchte ich mal eine kurze Info bezüglich dieser Funktion.

So weit ich mir das zusammengegoogelt habe, rundet die Funktion zur nächsten Ganzzahl, also floor(x + 0.5). Und bei 3.5 wird quasi zufällig auf 3 oder 4 gerundet, je nachdem was am Prozessor gerade eingestellt ist. Richtig?

Ich habe hier nämlich 'nen Code vor der Nase, in dem immer mittels lrintf(x-0.5) gerundet wird. Entweder habe ich die Funktion falsch versanden, oder der Code macht keinen Sinn. *ist gerade etwas verunsichert*

TIA & MfG
Sven
 
Sicher das das nicht printf heißen soll? So weit liegen die Tasten nicht auseinander. Floor sollte immer abrunden das gegenstück dazu ist Ceil welches immer aufrunded.
 
:ugly: Das ist normales runden... rint(); und das lrintf bedeutet das du float "reinsteckst" und long rausbekommst. Und die -0.5 sorgen dafür das immer abgerundet wird...
 
:ugly: Das ist normales runden... rint(); und das lrintf bedeutet das du float "reinsteckst" und long rausbekommst.
Na, für den Smiley bin ich wohl nicht mehr noob genug.

Sorry, vielleicht habe ich mich ungenau ausgedrückt. Wenn rint() dem normalem Runden entspricht, was ist dann normales Runden? Für mich bedeutet normales Runden, dass Nachkommastellen deren Betrag kleiner als 0.5 ist abgeschnitten oder sonst zum Wert mit dem nächst größeren Betrag gerundet werden. Laut IEEE sieht das Fießkommaformat jedoch vier (umschaltbare?) Rundungsverfahren vor, die nicht dem genannten entsprechen.

rint() ist eine optimierte Abwandlung der normalen Typkonvertierung und nutzt vermutlich eines der IEEE-Verfahren. Soweit ich die Dokumentation verstanden habe, ist also zu erwarten, dass lrint(3.75) und (long)(3.75) bzw. (long)(3.75 + 0.5) zu einem identischen Ergebnis führen können, dies aber nicht garantiert ist.

Inzwischen habe ich jetzt doch den LCC installiert und mal ein kleines Test-Prog laufen lassen:
PHP:
  x  |int(x)|floor(x+0.5)|ceil(x-0.5)|round(x)|rint(x)|rint(x-0.5)
-4.00|  -4  |     -4     |    -4     |   -4   |  -4   |   -4
-3.75|  -3  |     -4     |    -4     |   -4   |  -4   |   -4
-3.50|  -3  |     -3     |    -4     |   -4   |  -4   |   -4
-3.25|  -3  |     -3     |    -3     |   -3   |  -3   |   -4
-3.00|  -3  |     -3     |    -3     |   -3   |  -3   |   -4
-2.75|  -2  |     -3     |    -3     |   -3   |  -3   |   -3
-2.50|  -2  |     -2     |    -3     |   -3   |  -2   |   -3
-2.25|  -2  |     -2     |    -2     |   -2   |  -2   |   -3
-2.00|  -2  |     -2     |    -2     |   -2   |  -2   |   -2
-1.75|  -1  |     -2     |    -2     |   -2   |  -2   |   -2
-1.50|  -1  |     -1     |    -2     |   -2   |  -2   |   -2
-1.25|  -1  |     -1     |    -1     |   -1   |  -1   |   -2
-1.00|  -1  |     -1     |    -1     |   -1   |  -1   |   -2
-0.75|  +0  |     -1     |    -1     |   -1   |  -1   |   -1
-0.50|  +0  |     +0     |    -1     |   -1   |  +0   |   -1
-0.25|  +0  |     +0     |    +0     |   +0   |  +0   |   -1
+0.00|  +0  |     +0     |    +0     |   +0   |  +0   |   +0
+0.25|  +0  |     +0     |    +0     |   +0   |  +0   |   +0
+0.50|  +0  |     +1     |    +0     |   +1   |  +0   |   +0
+0.75|  +0  |     +1     |    +1     |   +1   |  +1   |   +0
+1.00|  +1  |     +1     |    +1     |   +1   |  +1   |   +0
+1.25|  +1  |     +1     |    +1     |   +1   |  +1   |   +1
+1.50|  +1  |     +2     |    +1     |   +2   |  +2   |   +1
+1.75|  +1  |     +2     |    +2     |   +2   |  +2   |   +1
+2.00|  +2  |     +2     |    +2     |   +2   |  +2   |   +2
+2.25|  +2  |     +2     |    +2     |   +2   |  +2   |   +2
+2.50|  +2  |     +3     |    +2     |   +3   |  +2   |   +2
+2.75|  +2  |     +3     |    +3     |   +3   |  +3   |   +2
+3.00|  +3  |     +3     |    +3     |   +3   |  +3   |   +2
+3.25|  +3  |     +3     |    +3     |   +3   |  +3   |   +3
+3.50|  +3  |     +4     |    +3     |   +4   |  +4   |   +3
+3.75|  +3  |     +4     |    +4     |   +4   |  +4   |   +3
+4.00|  +4  |     +4     |    +4     |   +4   |  +4   |   +4
Okay, also rint() entspricht nicht (unbedingt) dem normalen Runden, jedoch fallen die Unterschiede vermutlich nicht ins Gewicht.

Und die -0.5 sorgen dafür das immer abgerundet wird...
Vermutlich wurde so versucht, die normale Konvertierung ins int-Format nachzubilden, was jedoch komplett daneben ging, siehe letzte Spalte der Tabelle. (Negative Werte vergessen? :roll:)

Okay, ich denke, das war's, was ich wissen wollte. Danke.

MfG
Sven