我听说该static_cast函数应该优先于C风格或简单的函数式转换.这是真的?为什么?
我需要编写函数double_to_int(double val, int *err),在可能的情况下,它会将double val转换为整数; 否则报告错误(NAN/INFs/OUT_OF_RANGE).
所以伪代码实现看起来像:
if isnan(val):
err = ERR_NAN
return 0
if val < MAX_INT:
err = ERR_MINUS_INF
return MIN_INT
if ...
return (int)val
Run Code Online (Sandbox Code Playgroud)
在SO上至少有两个类似的问题:在这个答案中它以足够干净的方式解决了,虽然它是C++解决方案 - 在C中我们没有signed int的可移植数字.在这个答案中,它解释了为什么我们不能只检查(val > INT_MAX || val < INT_MIN).
因此,我看到的唯一可能的清洁方式是使用浮点环境,但它被称为实现定义的功能.
所以我的问题是:有没有办法以double_to_int跨平台的方式实现功能(仅基于C标准,甚至不考虑支持IEEE-754的目标平台).
这个问题可能会被问到,但我搜索到了,找不到答案.
我正在实现一个玩具虚拟机,其中OpCodes采用以下形式:
std::tuple<int8_t, int64_t, int64_t> // instruction op1, op2
Run Code Online (Sandbox Code Playgroud)
我正在尝试将一个double打包到其中一个操作数中,并在处理它时再次读回它.这不能可靠地工作.
double d = ...
auto a = static_cast<int64_t>(d);
auto b = static_cast<double>(a)
// sometimes, b != d
Run Code Online (Sandbox Code Playgroud)
有没有办法将double的位表示打包成int64_t,然后读取该位模式返回得到与之前完全相同的双精度数?
NaN可能具有许多不同的二进制表示,这通常可用于提供有关NaN导致的更多信息.任何IEEE 32位浮点格式x111 1111 1xxx xxxx xxxx xxxx xxxx xxxx为NaN.此外,2个NaN(可能不同的二进制值)之间的任何比较评估为假.
给两个花车:
float a = NaN1;
float b = NaN2;
Run Code Online (Sandbox Code Playgroud)
两者都是NaN,但x上面的位可能有不同的值,比较它们的二进制内容的最正确方法是什么(即检查它们是否是相同类型的NaN)?
对我来说最明显的方法是执行c样式转换,*(uint32_t*)&a == *(uint32_t*)&b 但是,浮点数的大小不能保证为32位.
除了显然预期的分数值损失,我不明白为什么会发生这种情况......
请考虑以下用于将数字转换为英语短语的作业分配片段:
int main() {
float dollars;
cout << "Please supply a dollar amount between $0.01 and $9999.99 (without the dollar sign): ";
while (true) {
cin >> dollars;
if (cin.fail() || dollars < 0.01 || dollars > 9999.99) {
cin.clear();
cin.ignore();
cout << "You provided an invalid number. Please try again: ";
} else {
// Test code:
cout << "You entered: " << dollars << endl;
cout << "Times 100 without cast: " << dollars * 100 << …Run Code Online (Sandbox Code Playgroud)