C++相談室 part144

■ このスレッドは過去ログ倉庫に格納されています
2019/07/22(月) 13:18:35.52ID:gptRHpgT
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part143
https://mevius.5ch.net/test/read.cgi/tech/1560574313/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
2019/08/12(月) 23:30:07.71ID:S6a2ieXo
「エクセス64」とかでググればいいと思うよ
2019/08/12(月) 23:30:19.79ID:rRSk3cI0
https://en.m.wikipedia.org/wiki/IBM_hexadecimal_floating_point
2019/08/13(火) 10:45:33.34ID:dVadaxxz
こんな感じかな?保証はせん

uint64_t ibm = 0x3e10624dd2f1a9fcULL

if (ibm == 0x0) { return 0.0; }

uint64_t sign = ibm >> 63;
uint64_t ibmexp = (ibm >> 56) & 0x7f;
uint64_t ibmfrac = ibm & 0x00ff'ffff'ffff'ffffULL;

if (ibmexp == 0x0) { return std::numeric_limits<double>::quiet_NaN(); } //てきとう

uint64_t ieeeexp = (ibmexp - 64) * 4 + 1023;
uint64_t ieeefrac = ibmfrac;
while(ieeefrac & 0x0100'0000'0000'0000)
{
ieeefrac <<=1;
--ieeeexp;
}
ieeefrac ^= 0x0100'0000'0000'0000;
ieeefrac >>= 1;

uint64_t ieee = (sign << 63) | (ieeeexp << 55) | ieeefrac;
return *reinterpret_cast<double*>(&ieee);
2019/08/13(火) 14:26:32.23ID:69RK7xLA
whileの条件逆じゃね?
2019/08/13(火) 16:15:58.84ID:dVadaxxz
せやなうっかり
2019/08/13(火) 16:22:35.35ID:dVadaxxz
というか指数部のビット長勘違いしてたわ
459は捨ててください恥ずかしい
2019/08/13(火) 16:47:23.86ID:69RK7xLA
ieee形式は自前で変換せずにdoubleで計算してしまえばいいんでは?
2019/08/13(火) 16:53:18.70ID:dVadaxxz
frexpとldexpでやっちゃう方が間違えにくくていいのかな
2019/08/13(火) 18:22:46.77ID:PZEzWgAr
エクセス64か
半導体とかで使われるGDSIIの実数がそれなんだよね。
自力で実装したわー。
4bitを16進数一桁として考えてて、指数部は16^xで表現されててケチ表現なし。
2019/08/13(火) 20:43:52.09ID:qE6XkMY1
じゃあどっかにライブラリでもあるんじゃねえの
探したら出てくるパターンだろこれ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況