Int overflow erkennen

Moien

Gibt es eine Möglichkeit in C/C++ (Visual Studio C++) int overflows zu erkennen ? Mir läuft bei einer Addition ein „unsigned long long“ über … Klar kann ich vorher-nach Tests von Hand schreiben, aber eine Lösung im Exceptions-styl wäre mir lieber.

(und ja ich brauche diesen Wertebereich wirklich)

Danke.

Hallo,

wie wäre es mit std::overflow_exception in C++?

Gruß,
Lida

Moien

wie wäre es mit std::overflow_exception in C++?

Dann zeig mir mal wie man die Exception in diesen Code einbaut:

#include "stdafx.h"
#include 

int \_tmain(int argc, \_TCHAR\* argv[])
{
 try 
 {

 unsigned long a1 = 100;
 unsigned long a2 = 200;
 unsigned long a3 = a1 - a2;
 std::cout 

Übrigens: die /RTc-Option akzeptiert der Compiler beim Release nicht.

cu

Hallo,

Dann zeig mir mal wie man die Exception in diesen Code
einbaut:

hm, Du hast Recht, std::overflow_error nützt hier nicht viel, da das bei primitiven Typen schlicht und ergreifend nicht geworfen wird. Und ein std::bitset nutzt hier auch nicht viel (der würde sowas werfen). Was ich so beim Überfliegen der google-Ergebnisse gesehen habe, macht auch nicht wirklich Mut.

Sorry, da kann ich Dir dann auch nicht weiter helfen. Dafür hab’ ich was Neues dazu gelernt. Der Tag war nicht umsonst.

Lida

Hallo Pumpkin,

Gibt es eine Möglichkeit in C/C++ (Visual Studio C++) int
overflows zu erkennen ? Mir läuft bei einer Addition ein
„unsigned long long“ über … Klar kann ich vorher-nach Tests
von Hand schreiben, aber eine Lösung im Exceptions-styl wäre
mir lieber.

Direkt kenne ich keine Möglichkeit.
Du kannst Dir aber selber eine Klasse ‚BigNumber‘ definieren und bei der die Operatoren überladen. In die Operator-Funktionen kannst Du dann die Überprüfung einbauen und dort entsprechende Exceptions werfen. Das Ganze geht dann natürlich stark zur Lasten der Rechenzeit.
Vielleicht gibt es so etwas auch schon, schau mal bei boost nach.

(und ja ich brauche diesen Wertebereich wirklich)

Soweit ich weiß gibt es Funktionen, die Berechnungen mit beliebiger Genauigkeit anbieten.
Ein ‚apt-cache search precision | grep ^lib‘ lieferte bei mir u.a.
* libcln4 - Class Library for Numbers (C++)
* libgmp3c2 - Multiprecision arithmetic library
* libgmpxx3 - Multiprecision arithmetic library (C++ bindings)
* libcore++1c2 - C/C++ library for robust computation

Gruß
Diether

Moien

Du kannst Dir aber selber eine Klasse ‚BigNumber‘ definieren
und bei der die Operatoren überladen.

Das können andere besser, dafür gibt es die safeInt-Class von Intel.

Das Ganze geht dann
natürlich stark zur Lasten der Rechenzeit.

Und da war wieder mein anderes Problem…

(und ja ich brauche diesen Wertebereich wirklich)

Soweit ich weiß gibt es Funktionen, die Berechnungen mit
beliebiger Genauigkeit anbieten.

Dann geht die Performance ganz in den Keller. Das doofe ist: ich muss viele, viele „kleine“ Werte aufsummieren und das Resultat muss bis zu einer gewissen Grenze (2^64 - 5000) exakt passen (darüber ist es völlig wurscht, NaN oder Inf wie es doubles können würde reichen). Ich werd wohl oder übel in den saueren Apfel beissen müssen und die Checks an den kritischen Stellen selbst einbauen.

Danke.