![]() |
Re: floats auf Null prüfen (C++)
Man kann den Epsilonwert berechnen lassen.
Man nimmt die Zahl 1.0 und halbiert so lange, bis 1.0+Epsilon = 1.0 ergibt:
Delphi-Quellcode:
var
Epsilon : Double; procedure CalcMachineEpsilon; // abgekupfert aus der JCL und vereinfacht var One: Double; T: Double; begin One := 1.0; Epsilon := One; // vielleicht sollte man mit einem deutlich kleineren Wert beginnen repeat Epsilon := 0.5 * Epsilon; T := One + Epsilon; until One = T; end; |
Re: floats auf Null prüfen (C++)
@DMW: Hm, das geht tatsächlich nicht so. Das war nur schnell in der Vorlesung hingeschrieben, ich hab irgendwie gedacht ein double wäre 32 Bits lang und der Compiler wirds schon machen^^
Das mit den ints is mir klar, ich kenn das Zweierkomplement (und die float-Normen, drum wollt ich das vorderste Bit wegmachen). Soa, ich habs grad mal schnell ausprobiert, es macht keinen Unterschied^^
Code:
Die Priorität des Prozesses hab ich auf Echtzeit geschaltet um Einflüsse vom Multitasking weitestgehend auszuschließen und es kommt immer bei beiden das gleiche raus.
#include <iostream>
#include <conio.h> #include <windows.h> using namespace std; #define e 0.00001 #define NUM 999999999 inline bool isNull (double val, double ep = 0.000000001) { *reinterpret_cast <long long*> (&val) &= 0x7FFFFFFFFFFFFFFFull; return (val < ep); } int main() { LARGE_INTEGER Freq, Start, End; int i; double Zero = 0.0; QueryPerformanceFrequency(&Freq); cout << "Plx auf Echtzeit schalten und Taster drücken..."; getch(); cout << endl; QueryPerformanceCounter(&Start); for (i=0; i<NUM; i++) (Zero<e || Zero>-e); QueryPerformanceCounter(&End); cout << "(x<e || x>-e): " << (Start.QuadPart / (double)End.QuadPart) << " Sek." << endl; QueryPerformanceCounter(&Start); for (i=0; i<NUM; i++) isNull(Zero, e); QueryPerformanceCounter(&End); cout << "isNull: " << (Start.QuadPart / (double)End.QuadPart) << " Sek." << endl; return 0; }
Code:
@Chemiker: Wo ist IsZero drin? Die hab ich nicht gefunden, auch nicht beim fix googeln.
Plx auf Echtzeit schalten und Taster dr³cken...
(x<e || x>-e): 0.999548 Sek. isNull: 0.999548 Sek. Aber ich denk ich pack einfach die zwei Vergleiche in ne inline Funktion, die versteh ich später gleich wieder^^. Es macht ja eh keinen Unterschied. MfG, SnuffMaster23 |
Re: floats auf Null prüfen (C++)
Zitat:
|
Re: floats auf Null prüfen (C++)
Unit Math
bei Delphi for Win32 |
Re: floats auf Null prüfen (C++)
Zitat:
|
Re: floats auf Null prüfen (C++)
Zitat:
Edit: siehe unten |
Re: floats auf Null prüfen (C++)
@#15
folglich Maschinensprache=Assembler =Rad neu erfinden, jetzt bin ich aber wirklich raus aus diesem Thread |
Re: floats auf Null prüfen (C++)
Zitat:
|
Re: floats auf Null prüfen (C++)
Ein paar Dinge muß ich noch ergänzen:
Zitat:
|
Re: floats auf Null prüfen (C++)
Hallo,
@Mutetze1: Zitat:
Bis bald Chemiker |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz