C是不是具有可以测试值是不是在预期值的公差范围内的功能,如果不是,我该如何创建?

Posted

技术标签:

【中文标题】C是不是具有可以测试值是不是在预期值的公差范围内的功能,如果不是,我该如何创建?【英文标题】:Does C have functions that can test if value is within tolerance of an expected value, if not how do I create one?C是否具有可以测试值是否在预期值的公差范围内的功能,如果不是,我该如何创建? 【发布时间】:2019-12-02 21:36:20 【问题描述】:

我是 C 的新手,最近我有一个有趣的任务来玩弄科学数字。

任务是实现几个函数,将重量单位转换为其他单位,然后将不同的重量单位相互比较。

我的代码按我的预期工作,但是由于使用像 1e+6 这样的科学数字进行计算 我的 if 比较在他们的任务中失败了。

假设我有: A = 1 公斤

B = 2.2046226218 磅

在比较它们之前,我将 A 转换为磅。

但是数据丢失,1 kg 变得不等于 2.2046226218 lbs

后面的代码: if(a == b) //=> 返回 false

但这不是代码应该如何工作的。

因此我的想法是实现以下功能。

类似这样的:

bool inToleranceRange( a , b , tolerance_range) // returns true if a is in + || - tolerance range of b
  //TO DO


// later in code

int value = inToleranceRange(a, b, 1);
if( value == 1)
  printf("\na is equal to b");

不过,在我开始之前,我想问一下 C 中的标准库是否提供了完成此任务的函数?如果不是,您会建议我如何继续?

【问题讨论】:

你的意思是(a <= b+tr) && (b-tr <= a)(假设tr是正数)? 为您显示失败的代码,以便我们可以更具体地指出可能错误或改进的地方。您专注于您认为的解决方案,而不是向我们提供原始问题的全部细节(这是XY problem) 问题是浮点/双精度,工作到容差对我来说是一个合适的解决方案。另一种方法是使用定点数学。 @kaylum 我很乐意向您展示代码,但是我在部分代码中使用了我们的教授提供的库。我使用了一种解决方法来解决我的问题,但是它在控制台上生成了一个不受欢迎的输出,因此我想知道是否有一种方法可以实现更清晰的容差函数版本。 这能回答你的问题吗? Compare two floats 【参考方案1】:
bool inToleranceRange(double a, double b, double tolerance_range) 
    // returns true if a is in + || - tolerance range of b
    return (fabs(a-b) <= fabs(tolerance_range));

需要#include &lt;math.h&gt;

【讨论】:

谢谢!我实现了它并且代码按预期工作! 还有&lt;stdbool.h&gt; @EdwardKarak 当然是的。我会使用int,但bool 匹配OP 的原型。【参考方案2】:

要创建更通用的(伪)函数,您可以使用 C 编译器包含的宏生成器:

// definition
// x - value to check
// r - reference value
// t - tolerance
#define IsInTolerance(x, r, t) (((x) >= ((r) - (t))) && ((x) <= ((r) + (t))))

// usage examples
if (IsInTolerance(4.9, 5, 0.5))
    printf("In tolerance.\n");
if (!IsInTolerance(4, 6, 1))
    printf ("Not in tolerance!\n");

宏生成器是内置的(或以其他方式包含在每个 C 编译器环境中)。

【讨论】:

也感谢您的回答!如果我用另一种语言再次遇到这种情况,请保存您的代码! 你可以特别在 C 中使用它 - 每个 C 编译器都有内置的宏生成器(例如,用于头文件的interptetation)。

以上是关于C是不是具有可以测试值是不是在预期值的公差范围内的功能,如果不是,我该如何创建?的主要内容,如果未能解决你的问题,请参考以下文章

alloca 函数范围内的 goto 是不是有效?

JavaScript:闭包是不是可以通过值而不是像 PHP 中的引用来访问封闭范围内的变量?

计算列表是不是在数据库值的“范围内”

随机数生成器不会使用输入字段中的值生成给定范围内的预期数字[重复]

检查输入的日期时间是不是在 2 个日期时间值的范围内

在 JMH 中对具有不同值的循环进行微基准测试