amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Umfrage: Modulus / Rest [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

05.12.2005, 10:27 Uhr

Solar
Posts: 3680
Nutzer
Im Zusammenhang mit einem meiner Projekte (PDCLib) würde es mich mal interessieren, was "alternative" Compiler aus folgendem Code machen:

code:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    div_t val1 = div( -5, 2 );
    div_t val2 = div( 5, -2 );
    printf( "-5 / 2 -> %dn", (-5) / 2 );
    printf( "-5 %% 2 -> %dn", (-5) % 2 );
    printf( "div( -5, 2 ) -> %d, %dn", val1.quot, val1.rem );
    printf( "5 / -2 -> %dn", 5 / (-2) );
    printf( "5 %% -2 -> %dn", 5 % (-2) );
    printf( "div( 5, -2 ) -> %d, %dn", val2.quot, val2.rem );
    return 0;
}


Bitte mit Angabe des Compilers, Version, ggf. Zielplatform, und falls unterstützt, Standard-Version (C90 / C95 / C99).

Und nein, zumindest C90 ist alles andere als eindeutig bei der Definition, was Integer-Division mit negativen Operanden eigentlich macht. I-)

PS: Vor allem nicht-GCC würde mich interessieren - vbcc, StormC 3, SAS/C etc.

[ Dieser Beitrag wurde von Solar am 05.12.2005 um 12:32 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 11:55 Uhr

Robin
Posts: 1056
Nutzer
@Solar:

robin@dreckding:~$ gcc -v
Es werden eingebaute Spezifikationen verwendet.
Ziel: i486-linux-gnu
Konfiguriert mit: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --with-gxx-include-dir=/usr/include/c++/4.0.2 --enable-shared --with-system-zlib --libexecdir=/usr/lib --enable-nls --without-included-gettext --enable-threads=posix --program-suffix=-4.0 --enable-__cxa_atexit --enable-libstdcxx-allocator=mt --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-gc=boehm --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-werror --enable-checking=release i486-linux-gnu
Thread-Modell: posix
gcc-Version 4.0.2 20050808 (prerelease) (Ubuntu 4.0.1-4ubuntu9)

robin@dreckding:~$ ./Test123
-5 / 2 -> -2
-5 % 2 -> -1
div( -5, 2 ) -> -2, -1
5 / -2 -> -2
5 % -2 -> 1
div( 5, -2 ) -> -2, 1
--
(Bild) http://my.morphosi.net/

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 12:18 Uhr

Mad_Dog
Posts: 1944
Nutzer
@Solar:

-5 / 2 -> -2
-5 > -1
div( -5, 2 ) -> -2, -1
5 / -2 -> -2
5 > 1
div( 5, -2 ) -> -2, 1

Mit gcc 3.4.2 für Sparc64 Solaris.

--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 12:38 Uhr

geit
Posts: 332
[Ex-Mitglied]

VBCC vbcc 0.8i (beta patch 1)

vc test.c


-5 / 2 -> -2
-5 % 2 -> -1
div( -5, 2 ) -> -2, -1
5 / -2 -> -2
5 % -2 -> -1
div( 5, -2 ) -> -2, 1

Geit

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 12:53 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von geit:

5 % -2 -> -1


Uh-huh... Ausreißer #1. 8)

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 15:13 Uhr

DrNOP
Posts: 4118
Nutzer
-5 / 2 -> -2
-5 % 2 -> -1
div( -5, 2 ) -> -2, -1
5 / -2 -> -2
5 % -2 -> 1
div( 5, -2 ) -> -1, 3


Compiler ist ein CrossCompiler Sun Solaris -> VxWorks 68k:
cc68k --version
cygnus-2.7.2-960126
--
Es gibt keine Notbremse für all den technischen Humbug, mit dem wir unsere Zeit vertrödeln.

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 15:20 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von DrNOP:

div( 5, -2 ) -> -1, 3


8o 8o 8o 8o 8o

DrNOP, Du solltest dringend Deine CLib überprüfen. Die Implementierung eines prä-C99-Compilers ist zwar relativ frei in der Definition der Operatoren / und %, aber die Bibliotheksfunktion div() ist sehr genau definiert und sollte immer das korrekte Ergebnis liefern!

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 15:51 Uhr

Solar
Posts: 3680
Nutzer
Der Vollständigkeit halber von mir:

Visual Studio 6, gcc 3.4.4 cygming (sowohl -std=c89 als auch -std=c99), Sun WorkShop 6 update 1 C 5.2 2000/09/11 alle jeweils:

-5 / 2 -> -2
-5 % 2 -> -1
div( -5, 2 ) -> -2, -1
5 / -2 -> -2
5 % -2 -> 1
div( 5, -2 ) -> -2, 1

Wie gesagt, Abweichungen bei / und % sind erst ab C99 (ISO/IEC 9899:1999) "illegal"; die Bibliotheksfunktion div() sollte immer dieselben Ergebnisse liefern.

DrNOP: Da ich nicht davon ausgehe, das Du einen VxWorks-Crosscompiler zum Spaß betreibst... also ich würde mich mal mit den Jungs zusammensetzen, die bei Euch für die Entwicklungsumgebung verantwortlich sind. Die Lib ist jedenfalls Murks...

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 15:56 Uhr

ylf
Posts: 4112
Nutzer
StormC 3.0:
code:
-5 / 2 -> -2
-5 % 2 -> -1
div( -5, 2 ) -> -2, -1
5 / -2 -> -5
5 % -2 -> -2
div( 5, -2 ) -> -2, 1


bye, ylf

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 16:01 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von ylf:

5 / -2 -> -5


:shock2: :nuke: :shock2: :nuke: :shock2:

Das ist ja viel schlimmer, als ich gedacht habe... das kann man getrost als Compilerbug abschreiben...

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 16:35 Uhr

ylf
Posts: 4112
Nutzer
Zitat:
Original von Solar:
Zitat:
Original von ylf:

5 / -2 -> -5


:shock2: :nuke: :shock2: :nuke: :shock2:

Das ist ja viel schlimmer, als ich gedacht habe... das kann man getrost als Compilerbug abschreiben...


Joh, egal, was ich als Dividend angebe, solange der Divisor negativ ist, liefert er als Quotient den Dividend.

Das konnte ja selbst AmigaBasic von M$ schon besser. :D

bye, ylf

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 17:17 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von ylf:
5 / -2 -> -5

Joh, egal, was ich als Dividend angebe, solange der Divisor negativ ist, liefert er als Quotient den Dividend.

Das ist nicht der Dividend, 5!=-5
Mich würde mal interessieren, wie der zugehörige Assemblercode aussieht, ich mein, was macht er denn da?
Wobei, das sind ja compile-time Konstanten. Was passiert denn, wenn man Variablen benutzt?
Könnte doch gut sein, daß da was völlig anderes herauskommt.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 17:18 Uhr

Holger
Posts: 8116
Nutzer
@Solar:
Ist das Absicht, daß es sich um compile-time Konstanten handelt, oder wäre da nicht ein erweitertes Testprogramm sinnvoller?

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 18:59 Uhr

ylf
Posts: 4112
Nutzer
@Holger:
Tschuldigung, hast natürlich recht, ist der Dividend zuzüglich eines Negationszeichens.

bye, ylf :glow:

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 19:08 Uhr

Solar
Posts: 3680
Nutzer
Pfff... idealerweise sollte das keinen Unterschied machen. Ich hatte ehrlich gesagt nur wissen wollen, ob es "in freier Wildbahn" noch Compiler gibt, die bei negativen Operanden gegen -inf runden statt gegen Null. Das es derart eklatante Compilerfehler geben würde, hätte ich wirklich nicht erwartet.

OK, erweiterter Test. Mit Optimierungen aus müßte ein Funktionsaufruf ausreichen, oder?

code:
#include <stdio.h>
#include <stdlib.h>

#define cpp_quot1 -5 / 2
#define cpp_rem1  -5 % 2
#define cpp_quot2 5 / -2
#define cpp_rem2  5 % -2

void test_div( int numer, int denom )
{
    div_t val = div( numer, denom );
    printf( "(%d) / (%d)   -> %dn", numer, denom, numer / denom );
    printf( "(%d) %% (%d)   -> %dn", numer, denom, numer % denom );
    printf( "div( %d, %d ) -> %d, %dn", numer, denom, val.quot, val.rem );
    return;
}

int main()
{
    puts( "nCompiler:n" );
    test_div( -5, 2 );
    test_div( 5, -2 );
    puts( "nPräprozessor:n" );
    printf( "cpp_div( %d, %d ) -> %d, %dn", -5, 2, cpp_quot1, cpp_rem1 );
    printf( "cpp_div( %d, %d ) -> %d, %dn", 5, -2, cpp_quot2, cpp_rem2 );
    return 0;
}



[ Dieser Beitrag wurde von Solar am 05.12.2005 um 19:18 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 19:44 Uhr

Robin
Posts: 1056
Nutzer
Und nochmal MorphOS

Ram Disk:> gcc -v
Reading specs from /gg/lib/gcc-lib/ppc-morphos/2.95.4/specs
gcc version 2.95.4 20050701 (experimental/emm-zapek-cisc-morgoth)
Ram Disk:> Test123
-5 / 2 -> -2
-5 % 2 -> -1
div( -5, 2 ) -> -2, -1
5 / -2 -> -2
5 % -2 -> 1
div( 5, -2 ) -> -2, -1
--
(Bild) http://my.morphosi.net/

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 19:48 Uhr

Robin
Posts: 1056
Nutzer
Und nochmal MorphOS mit dem 2.Beispiel

Ram Disk:> Test123

Compiler:

(-5) / (2) -> -2
(-5) % (2) -> -1
div( -5, 2 ) -> -2, -1
(5) / (-2) -> -2
(5) % (-2) -> 1
div( 5, -2 ) -> -2, -1

Präprozessor:

cpp_div( -5, 2 ) -> -2, -1
cpp_div( 5, -2 ) -> -2, 1
--
(Bild) http://my.morphosi.net/

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 19:55 Uhr

geit
Posts: 332
[Ex-Mitglied]
Nochmal VBCC 0.8i (Beta Patch 1)

Compiler:

(-5) / (2) -> -2
(-5) % (2) -> -1
div( -5, 2 ) -> -2, -1
(5) / (-2) -> -2
(5) % (-2) -> -1
div( 5, -2 ) -> -2, 1

Präprozessor:

cpp_div( -5, 2 ) -> -2, -1
cpp_div( 5, -2 ) -> -2, -1

Geit

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 21:09 Uhr

Solar
Posts: 3680
Nutzer
Danke für die gute Beteiligung.

Für die, die nicht so in der Materie "drin" sind: Das GCC-Ergebnis ist das korrekte, zumindest seit C99 auch "offiziell". (Leicht nachzurechnen: (a/b)*b + a%b muß wieder a ergeben.)

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 22:02 Uhr

ylf
Posts: 4112
Nutzer
Und weil es beim letzten mal so lustig war:

code:
Compiler:

(-5) / (2)   -> -2
(-5) % (2)   -> -1
div( -5, 2 ) -> -2, -1
(5) / (-2)   -> -2
(5) % (-2)   -> 1
div( 5, -2 ) -> -2, 1

Präprozessor:

cpp_div( -5, 2 ) -> -2, -1
cpp_div( 5, -2 ) -> -5, -2


bye, ylf

[ - Antworten - Zitieren - Direktlink - ]

05.12.2005, 22:19 Uhr

Solar
Posts: 3680
Nutzer
...womit bewiesen wäre, das StormC das Problem nur mit compile-time-Konstanten hat.

Was die Sache natürlich nur unwesentlich besser macht, aber zumindest erklärt, warum dieser Fehler nicht jedem zweitbesten Programm im Gesicht explodiert. :lach:

[ - Antworten - Zitieren - Direktlink - ]

06.12.2005, 09:14 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Solar:
OK, erweiterter Test. Mit Optimierungen aus müßte ein Funktionsaufruf ausreichen, oder?

Wenn man Optimierung ausschalten kann. Ansonsten kann man die Testfunktion in ein separates Modul stecken. Aber auch da ist man vor Optimierung nicht gefeit, falls der Compiler über Modulgrenzen hinweg optimieren kann ;-)

[ - Antworten - Zitieren - Direktlink - ]

06.12.2005, 09:48 Uhr

Solar
Posts: 3680
Nutzer
Bei vbcc und StormC 3? Du träumst. :lach: :glow: I-)

[ - Antworten - Zitieren - Direktlink - ]

06.12.2005, 10:39 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Solar:
Bei vbcc und StormC 3? Du träumst. :lach: :glow: I-)

VBCC kann über Modulgrenzen hinweg optimieren.

[ - Antworten - Zitieren - Direktlink - ]

06.12.2005, 15:23 Uhr

Solar
Posts: 3680
Nutzer
Maaaaann, Spielverderber. I-)

[ - Antworten - Zitieren - Direktlink - ]

06.12.2005, 16:44 Uhr

DrNOP
Posts: 4118
Nutzer
Okay, dann den völlig kranken Compiler auch nochmal: ;)

Compiler:

(-5) / (2) -> -2
(-5) % (2) -> -1
div( -5, 2 ) -> -2, -1
(5) / (-2) -> -2
(5) % (-2) -> 1
div( 5, -2 ) -> -1, 3

Präprozessor:

cpp_div( -5, 2 ) -> -2, -1
cpp_div( 5, -2 ) -> -2, 1

Ich werd' meine Kollegen mal informieren ...
--
Es gibt keine Notbremse für all den technischen Humbug, mit dem wir unsere Zeit vertrödeln.

[ - Antworten - Zitieren - Direktlink - ]

07.12.2005, 20:56 Uhr

Gazelle
Posts: 151
Nutzer
@Solar:

3.RAM Disk:> sc link test_div.c
SAS/C Amiga Compiler 6.58
Copyright (c) 1988-1995 SAS Institute Inc.
Slink - Version 6.58
Copyright (c) 1988-1995 SAS Institute, Inc. All Rights Reserved.


SLINK Complete - Maximum code size = 6280 ($00001888) bytes

Final output file size = 6292 ($00001894) bytes
3.RAM Disk:> test_div

Compiler:

(-5) / (2) -> -2
(-5) % (2) -> -1
div( -5, 2 ) -> -2, -1
(5) / (-2) -> -2
(5) % (-2) -> 1
div( 5, -2 ) -> -2, 1

Präprozessor:

cpp_div( -5, 2 ) -> -2, -1
cpp_div( 5, -2 ) -> -2, 1
3.RAM Disk:>

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Umfrage: Modulus / Rest [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.