@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:
#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;
}
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.
Code:
Plx auf Echtzeit schalten und Taster dr³cken...
(x<e || x>-e): 0.999548 Sek.
isNull: 0.999548 Sek.
@Chemiker: Wo ist IsZero drin? Die hab ich nicht gefunden, auch nicht beim fix googeln.
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