(Saya telah menandai pertanyaan "C" untuk saat ini, tetapi jika Anda mengetahui bahasa lain yang mendukung serikat pekerja, Anda juga dapat menggunakannya.)
Tugas Anda adalah membangun empat operator matematika standar + - * /
untuk struct berikut:
union intfloat{
double f;
uint8_t h[8];
uint16_t i[4];
uint32_t j[2];
uint64_t k;
intfloat(double g){f = g;}
intfloat(){k = 0;}
}
sedemikian rupa sehingga operasi itu sendiri hanya pernah memanipulasi atau mengakses bagian integer (jadi tidak ada perbandingan dengan ganda kapan saja selama operasi baik), dan hasilnya persis sama (atau secara fungsional setara, dalam hal hasil non-numerik seperti NaN
) seolah-olah operasi matematika yang sesuai telah diterapkan langsung ke double
gantinya.
Anda dapat memilih bagian integer mana yang akan dimanipulasi, bahkan mungkin menggunakan yang berbeda di antara operator yang berbeda. (Anda juga dapat memilih untuk menghapus "unsigned" dari salah satu bidang di serikat, meskipun saya tidak yakin apakah Anda ingin melakukannya.)
Skor Anda adalah jumlah dari panjang kode dalam karakter untuk masing-masing dari empat operator. Skor terendah menang.
Bagi kita yang tidak terbiasa dengan spesifikasi IEEE 754, berikut adalah artikel tentang itu di Wikipedia.
Suntingan:
03-06 08:47 Menambahkan konstruktor ke struct intfloat. Anda diizinkan untuk menggunakannya untuk pengujian, daripada mengatur secara manual ganda / dll.
sumber
intstruct
dalam haluint8_8
,uint16_t
dan seterusnya sebagai ukuran absolutshort
,int
dan sebagainya tidak ditentukan oleh standar (setiap jenis memiliki ukuran minimum dan ada pemesanan yang ketat dalam ukuran, tetapi itu dia).Jawaban:
C ++, ~ 1500 karakter
Perluas float ke representasi titik tetap 8000-biner, lakukan operasi itu, lalu konversikan kembali.
Saya terlalu malas untuk menghapus semua spasi dan baris baru untuk mendapatkan jumlah golf yang tepat, tetapi sekitar 1500 karakter.
sumber