相关疑难解决方法(0)

round()for C++中的float

我需要一个简单的浮点舍入函数,因此:

double round(double);

round(0.1) = 0
round(-0.1) = 0
round(-0.9) = -1
Run Code Online (Sandbox Code Playgroud)

我能找到ceil()floor()在math.h中-但不是round().

它是以另一个名称存在于标准C++库中,还是缺少?

c++ floating-point rounding

227
推荐指数
11
解决办法
36万
查看次数

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

以下代码适用于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万
查看次数

生成下一个最大或最小可表示的浮点数而不会产生比特错误

给定一个任意有限的浮点数,有没有办法确定下一个可表示的浮点数?例如,给定1.0f,根据定义,下一个最大可表示的数字是1.0f + std :: numeric_limits <float> :: epsilon().有没有一种方法可以合成任何值的epsilon - 而不仅仅是1.0f - 而不需要依赖于对机器如何表示浮点值的位置和/或显式知识?

c++ floating-point

18
推荐指数
1
解决办法
1731
查看次数

std :: numeric_limits :: is_exact ...什么是可用的定义?

正如我解释它,MSDN的定义numeric_limits::is_exact几乎都是假的:

在[this]类型上完成的[all]计算没有舍入误差.

IBM的定义几乎总是正确的:(或圆形的定义,这取决于你怎么看它)

一种对其所有值都有精确表示的类型

我确定的是,我可以2在a double和a中存储一个,long而且它们都可以完全代表.

然后,我可以将它们分开,10并且两者都不会完全保持数学结果.

给定任何数值数据类型T,定义的正确方法是std::numeric_limits<T>::is_exact什么?

编辑:我已经从许多答案中提供的详细信息中发布了我认为对此问题的准确答案. 这个答案不是赏金的竞争者.

c++ numeric-limits

10
推荐指数
2
解决办法
1234
查看次数

尝试模仿 Excel 舍入让我感到悲伤

该值是将 2.01 和 2.52 之和除以 2 的结果(2.01 + 2.52) / 2。Excel 将该值显示为 2.265,当格式化为 2 位数字时,该值为 2.27。但是,文件中存储的值为 2.2649999999999997。当我重新创建这是 C# 时,我也在变量中得到该值,而不是 2.265。据我所知,这是由于 4.53 除以 2 的浮点精度问题造成的。

double result = (2.01 + 2.52) / 2;
Console.WriteLine(result);
Run Code Online (Sandbox Code Playgroud)

控制台显示 2.265,但 QuickWatch 调试器中显示的值显示 2.264999999999997。我怀疑 WriteLine 方法中将值转换为字符串可以纠正浮点精度错误。

当我申请时Math.Round(result, 2, MidpointRounding.AwayFromZero),结果并不2.262.27我预期的那样。似乎它查看了我想要四舍五入的数字右侧的第一个数字,发现它是 4,并忽略了它右侧的所有其他数字。问题在于,这些 9 只是由于精度问题而存在,并且需要包含在内,或者更好的是,该值应该是2.265

我在代码中所做的就是从 Excel 电子表格中读取文本值"2.2649999999999997",将其转换为双精度型2.264999999999999,然后转换为字符串,这给了我"2.265". 然后我将其转换回双精度,2.265以便我可以将 应用于Math.Round它并获得 的预期结果2.27。这是完整的代码:

double result = Convert.ToDouble(((2.01 + 2.52) …
Run Code Online (Sandbox Code Playgroud)

c# excel rounding-error rounding

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

精确地返回双精度

假设我有一个返回a的方法double,但我想确定要返回的值的点后的精度.我不知道变量的价值double.

例:

double i = 3.365737;
return i;
Run Code Online (Sandbox Code Playgroud)

我希望返回值在点之后具有3个数字的精度

含义:返回值为3.365.

另一个例子:

double i = 4644.322345;
return i;
Run Code Online (Sandbox Code Playgroud)

我希望返回值为: 4644.322

c c++ double

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