Pertanyaan Ubah mode pembulatan titik mengambang


Apa cara yang paling efisien untuk mengubah mode pembulatan * dari angka floating point IEEE 754? Fungsi C portabel akan menyenangkan, tetapi solusi yang menggunakan perakitan x86 juga baik.

* Saya mengacu pada mode pembulatan standar menuju terdekat, menuju nol, dan menuju infinity positif / negatif


32
2017-07-29 01:26


asal


Jawaban:


Ini adalah solusi standar C:

#include <fenv.h>
#pragma STDC FENV_ACCESS ON

// store the original rounding mode
const int originalRounding = fegetround( );
// establish the desired rounding mode
fesetround(FE_TOWARDZERO);
// do whatever you need to do ...

// ... and restore the original mode afterwards
fesetround(originalRounding);

Pada platform mundur yang tidak mendukung C99, Anda mungkin perlu melakukan perakitan. Dalam hal ini, Anda mungkin ingin mengatur pembulatan untuk kedua unit x87 (melalui fldcw instruksi) dan SSE (melalui ldmxcsr petunjuk).

Edit Anda tidak perlu menggunakan perakitan untuk MSVC. Anda dapat menggunakan (sama sekali tidak standar) _control_fp( ) sebagai gantinya:

unsigned int originalRounding = _control_fp(0, 0);
_control_fp(_RC_CHOP, _MCW_RC);
// do something ...
_control_fp(originalRounding, _MCW_RC);

Anda dapat membaca lebih lanjut tentang _control_fp () di MSDN.

Dan, hanya untuk kelengkapan, cincin decoder untuk nama makro untuk mode pembulatan:

rounding mode    C name         MSVC name
-----------------------------------------
to nearest       FE_TONEAREST   _RC_NEAR
toward zero      FE_TOWARDZERO  _RC_CHOP
to +infinity     FE_UPWARD      _RC_UP
to -infinity     FE_DOWNWARD    _RC_DOWN

35
2017-07-29 01:31



ini mungkin membantu.

Edit: Saya akan mengatakan Anda akan membutuhkan fungsi Anda sendiri. Anda dapat menggunakan perakitan di dalam C.

Tetapi jika Anda mendaftarkan ukuran 64bits, membulatkannya ke 32bit akan membuat perhitungan Anda lebih cepat. Ini benar-benar akan membuatnya lebih lambat. Ingat kalkulasi 64bit mudah untuk 64 mikroprosesor daripada 2-32bit. Saya tidak tahu apa tepatnya yang ingin Anda capai. Saya tahu kinerja sesuai dengan kriteria Anda.


-3
2017-07-29 01:30