相关疑难解决方法(0)

如何在C中将double转换为int?

double a;
a = 3669.0;
int b;
b = a;
Run Code Online (Sandbox Code Playgroud)

我在b中得到3668,而不是3669.

我该如何解决这个问题?如果有这样的3559.8我也想要像3559而不是3560.

c

23
推荐指数
3
解决办法
14万
查看次数

C:将最小32位整数(-2147483648)转换为float给出正数(2147483648.0)

当我遇到一些我觉得奇怪的行为时,我正在研究一个嵌入式项目.我设法在键盘上重现它(见下文)以确认,但我的机器上没有任何其他C编译器可以在它们上进行尝试.

场景:我有一个#define32位整数可以容纳的最负值,然后我尝试使用它来与浮点值进行比较,如下所示:

#define INT32_MIN (-2147483648L)

void main()
{
    float myNumber = 0.0f;
    if(myNumber > INT32_MIN)
    {
        printf("Everything is OK");
    }
    else
    {
        printf("The universe is broken!!");
    }
}
Run Code Online (Sandbox Code Playgroud)

键盘链接:http://codepad.org/cBneMZL5

对我来说,看起来这个代码应该可以正常工作,但令我惊讶的是它打印出来The universe is broken!!.

此代码隐式地将其转换INT32_MIN为a float,但事实证明,这会导致浮点值为2147483648.0(正!),即使浮点类型完全能够表示-2147483648.0.

有没有人对这种行为的原因有任何见解?

代码解决方案:正如Steve Jessop在他的回答中提到的,limits.h并且已经stdint.h包含正确的(工作)int范围define,所以我现在使用这些而不是我自己的#define

问题/解决方案解释摘要:鉴于答案和讨论,我认为这是对正在发生的事情的一个很好的总结(注意:仍然阅读答案/评论,因为它们提供了更详细的解释):

  • 我使用C89编译器具有32位longS,SO大于任何值LONG_MAX且小于或等于ULONG_MAX随后L后缀的类型为unsigned long
  • (-2147483648L)实际上是-一个unsigned …

c floating-point int minimum long-integer

14
推荐指数
2
解决办法
4738
查看次数

为什么将大型双精度转换为uint16_t并对gcc和clang进行优化会给出不同的答案

当打开优化时,下面的代码会在gcc上产生不同的结果.如果没有优化,gcc会产生与clang相同的结果.

#include <cfloat>
#include <cstdint>

double big_dbl() { return DBL_MAX; }

int main() {
    return static_cast<std::uint16_t>(big_dbl());
}
Run Code Online (Sandbox Code Playgroud)

汇编器输出-O0显示gcc和clang都调用empty_dbl并用于cvttsd2si执行浮点 - > int转换,然后转换为16位无符号值并生成0.调高优化级别以-01优化empty_dbl两个编译器中的调用,但clang仍然0作为强制转换的结果给出,而gcc给出65535.结果可以在编译器资源管理器中看到.

这是gcc优化器中的错误还是未定义的行为,因此优化器可以做它喜欢的事情?

这最近让我们感到困惑,在某种意义上,谢天谢地,因为它显示了一个big_dbl错误使用的场景,我们已经正确修复了代码,但我想了解与gcc的不同之处.

c++ gcc

3
推荐指数
1
解决办法
78
查看次数

C++问题中的sqrt函数

#include <iostream>
#include <cmath>

using namespace std;

int main(){
    
    int n;
    cin >> n;
    
    int i = sqrt(1 + 2 * n * (n + 1)) - 1;
    
    cout << i;
}
Run Code Online (Sandbox Code Playgroud)

我编写了一个简单的程序,它利用了sqrt()C++ 中的函数。即使输入sqrt()为正,上述程序也会在控制台上打印出 n = 32768 的负值。我尝试将语句从 更改为int i = sqrt(1 + 2 * n * (n + 1)) - 1;
double i = sqrt(1 + 2 * n * (n + 1)) - 1;但错误未解决。

输出:

32768
-2147483648

上面的输出是为了 int i = …

c++ sqrt

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

标签 统计

c ×2

c++ ×2

floating-point ×1

gcc ×1

int ×1

long-integer ×1

minimum ×1

sqrt ×1