amiga-news 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. 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. ]

[ - 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:
Original von geit:

5 % -2 -> -1


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

[ - 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:
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!

[ - 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:
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...

[ - Answer - Quote - Direct link - ]

2005-12-05, 16:35 h

ylf
Posts: 4112
User
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

[ - Answer - Quote - Direct link - ]

2005-12-05, 17:17 h

Holger
Posts: 8116
User
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.

[ - 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 :glow:

[ - 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. :lach:

[ - Answer - Quote - Direct link - ]

2005-12-06, 09:14 h

gni
Posts: 1106
User
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 ;-)

[ - Answer - Quote - Direct link - ]

2005-12-06, 09:48 h

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

[ - Answer - Quote - Direct link - ]

2005-12-06, 10:39 h

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

VBCC kann über Modulgrenzen hinweg optimieren.

[ - Answer - Quote - Direct link - ]

2005-12-06, 15:23 h

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

[ - 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-2024 by amiga-news.de - all rights reserved.
.