前提・実現したいこと
整数(ULONGLONG)に実数(float)を代入したいです。
しかし、期待する値と一致しません。
XMMレジスタ用のM128A型のLOWはULONGLONG, HIGHはLONGLONGで定義されている為float値をそのまま入れてもキャスト時に切り捨てられてしまうようです。
どうすれば期待する値を得ることが出来ますか?
該当のソースコード
c++
1#include <Windows.h> 2#include <iostream> 3 4int main() { 5 M128A xmm0{ 0 }; 6 float value; 7 8 value = 0.0f; 9 xmm0.Low = static_cast<ULONGLONG>(value); 10 std::cout << std::fixed << static_cast<float>(xmm0.Low) << std::endl; 11 // 期待する出力: 0.000000 12 // 実際に得られる出力: 0.000000 13 14 value = 100.0f; 15 xmm0.Low = static_cast<ULONGLONG>(value); 16 std::cout << std::fixed << static_cast<float>(xmm0.Low) << std::endl; 17 // 期待する出力: 100.000000 18 // 実際に得られる出力: 100.000000 19 20 value = 100.123f; 21 xmm0.Low = static_cast<ULONGLONG>(value); 22 std::cout << std::fixed << static_cast<float>(xmm0.Low) << std::endl; 23 // 期待する出力: 100.123000 24 // 実際に得られる出力: 100.000000 25 26 value = 0.1f; 27 xmm0.Low = static_cast<ULONGLONG>(value); 28 std::cout << std::fixed << static_cast<float>(xmm0.Low) << std::endl; 29 // 期待する出力: 0.100000 30 // 実際に得られる出力: 0.000000 31 32 return 0; 33} 34
試したこと
- キャスト時に値が切り捨てられないようにmemcpyを使用する形にしてみましたがダメでした。
c++
1#include <Windows.h> 2#include <iostream> 3 4int main() { 5 M128A xmm0{ 0 }; 6 float value = 0.1f; 7 8 memcpy(&xmm0.Low, &value, sizeof(value)); 9 std::cout << std::fixed << static_cast<float>(xmm0.Low) << std::endl; 10 // 期待する出力: 0.100000 11 // 実際に得られる出力: 1036831936.000000 12 13 return 0; 14}
補足情報(FW/ツールのバージョンなど)
- Windows 10 64bit Pro
- Visual Studio 2019 (v142) / MSVC
- ISO C++ 14
回答3件
あなたの回答
tips
プレビュー