![]() |
DEUTSCHE VERSION |
|
![]() |
Links | | | Forums | | | Comments | | | Report news |
![]() |
Chat | | | Polls | | | Newsticker | | | Archive |
![]() |
amiga-news.de Forum > Programmierung > Umfrage: Modulus / Rest | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2005-12-05, 10:27 h Solar Posts: 3680 User |
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. ![]() 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. ] [ - Answer - Quote - Direct link - ] |
2005-12-05, 11:55 h Robin Posts: 1056 User |
@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/ [ - Answer - Quote - Direct link - ] |
2005-12-05, 12:18 h Mad_Dog Posts: 1944 User |
@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 [ - Answer - Quote - Direct link - ] |
2005-12-05, 12:38 h geit Posts: 332 [Former member] |
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 [ - Answer - Quote - Direct link - ] |
2005-12-05, 12:53 h Solar Posts: 3680 User |
Zitat: Uh-huh... Ausreißer #1. ![]() [ - Answer - Quote - Direct link - ] |
2005-12-05, 15:13 h DrNOP Posts: 4118 User |
-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. [ - Answer - Quote - Direct link - ] |
2005-12-05, 15:20 h Solar Posts: 3680 User |
Zitat: ![]() ![]() ![]() ![]() ![]() 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! [ - Answer - Quote - Direct link - ] |
2005-12-05, 15:51 h Solar Posts: 3680 User |
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... [ - Answer - Quote - Direct link - ] |
2005-12-05, 15:56 h ylf Posts: 4112 User |
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 [ - Answer - Quote - Direct link - ] |
2005-12-05, 16:01 h Solar Posts: 3680 User |
Zitat: ![]() ![]() ![]() ![]() ![]() Das ist ja viel schlimmer, als ich gedacht habe... das kann man getrost als Compilerbug abschreiben... [ - Answer - Quote - Direct link - ] |
2005-12-05, 16:35 h ylf Posts: 4112 User |
Zitat: 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. ![]() bye, ylf [ - Answer - Quote - Direct link - ] |
2005-12-05, 17:17 h Holger Posts: 8116 User |
Zitat: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. [ - Answer - Quote - Direct link - ] |
2005-12-05, 17:18 h Holger Posts: 8116 User |
@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. [ - Answer - Quote - Direct link - ] |
2005-12-05, 18:59 h ylf Posts: 4112 User |
@Holger: Tschuldigung, hast natürlich recht, ist der Dividend zuzüglich eines Negationszeichens. bye, ylf ![]() [ - Answer - Quote - Direct link - ] |
2005-12-05, 19:08 h Solar Posts: 3680 User |
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. ] [ - Answer - Quote - Direct link - ] |
2005-12-05, 19:44 h Robin Posts: 1056 User |
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/ [ - Answer - Quote - Direct link - ] |
2005-12-05, 19:48 h Robin Posts: 1056 User |
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/ [ - Answer - Quote - Direct link - ] |
2005-12-05, 19:55 h geit Posts: 332 [Former member] |
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 [ - Answer - Quote - Direct link - ] |
2005-12-05, 21:09 h Solar Posts: 3680 User |
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.) [ - Answer - Quote - Direct link - ] |
2005-12-05, 22:02 h ylf Posts: 4112 User |
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 [ - Answer - Quote - Direct link - ] |
2005-12-05, 22:19 h Solar Posts: 3680 User |
...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. ![]() [ - Answer - Quote - Direct link - ] |
2005-12-06, 09:14 h gni Posts: 1106 User |
Zitat: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 ;-) [ - Answer - Quote - Direct link - ] |
2005-12-06, 09:48 h Solar Posts: 3680 User |
Bei vbcc und StormC 3? Du träumst. ![]() ![]() ![]() [ - Answer - Quote - Direct link - ] |
2005-12-06, 10:39 h gni Posts: 1106 User |
Zitat:VBCC kann über Modulgrenzen hinweg optimieren. [ - Answer - Quote - Direct link - ] |
2005-12-06, 15:23 h Solar Posts: 3680 User |
Maaaaann, Spielverderber. ![]() [ - Answer - Quote - Direct link - ] |
2005-12-06, 16:44 h DrNOP Posts: 4118 User |
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. [ - Answer - Quote - Direct link - ] |
2005-12-07, 20:56 h Gazelle Posts: 151 User |
@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:> [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Umfrage: Modulus / Rest | [ - Search - New posts - Register - Login - ] |
![]() |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2025 by amiga-news.de - all rights reserved. |
![]() |