以下代码适用于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中,这两者有什么区别?
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#中函数返回一个没有任何小数位的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) 使用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) 我一直在创建一个用于实施 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)
可以看出,如果我pow用int文字调用,结果将是数字的实际平方。但是,如果我使用 using 调用它int p=5,那么pow返回的结果实际上比预期的结果低一个。如果我将结果传递给一个float变量,它也会收到正确的结果。
现在,我知道pow计算幂的方法是通过近似计算,因此,在转换为整数时可能会出现诸如此类的错误。我可能就让它这样吧。但真正让我停下来思考的是num4. pow(p,2) …
根据 gfortran 文档,INT(x)两者FLOOR(x)都接受输入x并转换x为整数类型。FLOOR显然只允许输入 REAL 类型,而INT接受 INTEGER、REAL 和复数类型的输入。
INT允许的输入类型是和之间的唯一区别吗FLOOR?如果是这样,谁能解释为什么FLOOR存在,因为它显然是多余的?
“类似问题”框显示了C、C++和Python3中类似的 Stack Overflow 问题,但显然还没有人针对 Fortran 提出这个问题,这导致我深入询问它。
在Google和Stack Overflow上的快速搜索中包含 Fortran意味着没有出现任何有用的内容。因此,这无疑是重复的(除非 Fortran 具有INT将FLOOR其与 C/C++/Python 分开的怪癖),但我认为它将具有使结果更容易/快速搜索的实用性。