- Код: Выделить всё
var X:double;
Y:bitpacked array[0..sizeof(x)*8-1] of 0..1 absolute X;
И потом спокойно ковыряю битовый массив Y на предмет особенностей IEEE 754, проверяя результаты в переменной X.
Вопрос: в других языках есть столь-же простой метод? Чисто языковыми средствами, в пару строк, без запарок с классами-объектами?
Добавлено спустя 1 час 33 минуты 24 секунды:
Нда, решил проверить хваленый bitset из С++. Забиваю 500 миллионов бит единицами, потом в середине диапазона проверяю, нулю один бит, снова проверяю.
Результат - сливает bitset паскалю вчистую:
test.cpp
- Код: Выделить всё
#include <iostream>
#include <bitset>
using namespace std;
#define size 500000000
bitset<size> test;
int main()
{
long i;
for (i=0;i<size;i++)test[i]=1;
cout<<test[size/2]<<endl;
test[size/2]=0;
cout<<test[size/2]<<endl;
return 0;
}
Компилируем: g++ test.cpp -o test_cpp
Запускаем: time ./test_cpp
Получаем на моей машине:
- Код: Выделить всё
1
0
13.98user 0.04system 0:14.05elapsed 99%CPU (0avgtext+0avgdata 62192maxresident)k
0inputs+0outputs (0major+15607minor)pagefaults 0swaps
Теперь на паскале:
test.pp
- Код: Выделить всё
{$mode objfpc}
const size=500000000;
var test:bitpacked array[0..size]of 0..1;
i:longint;
begin
for i:=0 to size-1 do test[i]:=1;
writeln(test[size div 2]);
test[size div 2]:=0;
writeln(test[size div 2]);
end.
Компилируем: fpc test.pp -otest_pp
Запускаем: time ./test_pp
Получаем на моей машине:
- Код: Выделить всё
1
0
1.40user 0.07system 0:01.48elapsed 99%CPU (0avgtext+0avgdata 61132maxresident)k
0inputs+0outputs (0major+15748minor)pagefaults 0swaps
Полторы секунды против четырнадцати, разница по скорости - в 10 раз!
Может это только на моем 64-разрядном линуксе, но почему не думаю, что результаты будут особо отличаться на других осях и разрядах.