相关疑难解决方法(0)

启用优化后会产生不同的浮点结果 - 编译器错误?

以下代码适用于Visual Studio 2008,有无优化.但它只适用于没有优化的G ++(O0).

#include <cstdlib>
#include <iostream>
#include <cmath>

double round(double v, double digit)
{
    double pow = std::pow(10.0, digit);
    double t = v * pow;
    //std::cout << "t:" << t << std::endl;
    double r = std::floor(t + 0.5);
    //std::cout << "r:" << r << std::endl;
    return r / pow;
}

int main(int argc, char *argv[])
{
    std::cout << round(4.45, 1) << std::endl;
    std::cout << round(4.55, 1) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出应该是:

4.5
4.6
Run Code Online (Sandbox Code Playgroud)

但是带有优化(O1- O3)的g ++ …

c++ optimization g++ c++-faq

103
推荐指数
3
解决办法
2万
查看次数

C:(int)x和floor(x)之间的差异?

在C中,这两者有什么区别?

float myF = 5.6;

printf( "%i \n", (int)myF ); // gives me "5"
printf( "%ld \n", floor(myF) ); // also "5"?
Run Code Online (Sandbox Code Playgroud)

什么时候优于另一个?

c floating-point

19
推荐指数
2
解决办法
2万
查看次数

使用Math.Floor而不是显式整数转换有什么好处吗?

问题非常简单,是否有任何好处或差异?我注意到在C#中函数返回一个没有任何小数位的double,而在java中它保留了小数位,但除此之外结果是相同的.

这是我在Java和C#中使用的代码,以及输出:

//Java                                        //C#

double a = 5.5;                               double a = 5.5;
System.out.println(Math.floor(a));            Console.WriteLine(Math.Floor(a));
System.out.println((int)a);                   Console.WriteLine((int)a);

//Output                                      //Output

5.0                                           5
5                                             5
Run Code Online (Sandbox Code Playgroud)

c# java math casting floor

11
推荐指数
1
解决办法
6147
查看次数

转换为 int 与 Math.floor

使用cast to int而不是Math.floor将float/double值转换为整数是否节省?

var scale = 1.5;
int foo1 = (int)scale;
int foo2 = Math.floor(scale);
Run Code Online (Sandbox Code Playgroud)

vala

10
推荐指数
1
解决办法
8243
查看次数

pow() 在特定条件下返回错误结果(以及意外修复) - 为什么会这样?

我一直在创建一个用于实施 Eratosthenes 筛分的简短程序。在他的程序中,我使用 int startingPointwhich 保存了当前素数的值,它的乘法被标记为非素数,从它的平方开始。我使用 pow() 函数计算当前循环中起点的平方。这样做的时候,我遇到了一个奇怪的现象。当startingPoint等于 时5,则后int i = pow(startingPoint,2)的值为i24,而不是 25。这种现象仅在startingPoint等于 5时发生。之后,我运行了一些测试,导致以下代码片段:

#include <iostream>
#include <math.h>

int main()
{
    int p=5;

    int num1 = pow(5,2);
    int num2 = pow(p,2);
    float num3 = pow(p,2);
    int num4 = floor(pow(p,2));

    std::cout.precision(10);

    std::cout<<num1<<std::endl; //25
    std::cout<<num2<<std::endl; //24
    std::cout<<std::fixed<<num3<<std::endl; //25.0000000000
    std::cout<<num4<<std::endl; //25            
}
Run Code Online (Sandbox Code Playgroud)

可以看出,如果我powint文字调用,结果将是数字的实际平方。但是,如果我使用 using 调用它int p=5,那么pow返回的结果实际上比预期的结果低一个。如果我将结果传递给一个float变量,它也会收到正确的结果。

现在,我知道pow计算幂的方法是通过近似计算,因此,在转换为整数时可能会出现诸如此类的错误。我可能就让它这样吧。但真正让我停下来思考的是num4. pow(p,2) …

c++ gcc pow

6
推荐指数
0
解决办法
1942
查看次数

Fortran 中的 INT 与 FLOOR

根据 gfortran 文档,INT(x)两者FLOOR(x)都接受输入x并转换x为整数类型。FLOOR显然只允许输入 REAL 类型,而INT接受 INTEGER、REAL 和复数类型的输入。

INT允许的输入类型是和之间的唯一区别吗FLOOR?如果是这样,谁能解释为什么FLOOR存在,因为它显然是多余的?

“类似问题”框显示了CC++Python3中类似的 Stack Overflow 问题,但显然还没有人针对 Fortran 提出这个问题,这导致我深入询问它。

在GoogleStack Overflow上的快速搜索中包含 Fortran意味着没有出现任何有用的内容。因此,这无疑是重复的(除非 Fortran 具有INTFLOOR其与 C/C++/Python 分开的怪癖),但我认为它将具有使结果更容易/快速搜索的实用性。

fortran

5
推荐指数
1
解决办法
5104
查看次数

标签 统计

c++ ×2

c ×1

c# ×1

c++-faq ×1

casting ×1

floating-point ×1

floor ×1

fortran ×1

g++ ×1

gcc ×1

java ×1

math ×1

optimization ×1

pow ×1

vala ×1