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 <math.h>
。
【讨论】:
谢谢!我实现了它并且代码按预期工作! 还有<stdbool.h>
@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是不是具有可以测试值是不是在预期值的公差范围内的功能,如果不是,我该如何创建?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript:闭包是不是可以通过值而不是像 PHP 中的引用来访问封闭范围内的变量?