相关疑难解决方法(0)

为什么使用static_cast <int>(x)而不是(int)x?

我听说该static_cast函数应该优先于C风格或简单的函数式转换.这是真的?为什么?

c++ casting

628
推荐指数
9
解决办法
33万
查看次数

可以在便携式C中写入从double到int的转换

我需要编写函数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的目标平台).

c floating-point standards

19
推荐指数
1
解决办法
677
查看次数

将double转换为int64_t并返回而不丢失信息

这个问题可能会被问到,但我搜索到了,找不到答案.

我正在实现一个玩具虚拟机,其中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,然后读取该位模式返回得到与之前完全相同的双精度数?

c++ c++17

4
推荐指数
1
解决办法
615
查看次数

将float与特定NAN值进行比较的最正确方法是什么?

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位.

c++ floating-point equality ieee-754

0
推荐指数
1
解决办法
111
查看次数

在c ++中将float转换为int时丢失数据

除了显然预期的分数值损失,我不明白为什么会发生这种情况......

请考虑以下用于将数字转换为英语短语的作业分配片段:

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)

c++

0
推荐指数
1
解决办法
340
查看次数

标签 统计

c++ ×4

floating-point ×2

c ×1

c++17 ×1

casting ×1

equality ×1

ieee-754 ×1

standards ×1