如何在不使用c中的关系运算符的情况下返回true或false?

时间:2019-02-03 21:15:03

标签: c mathematical-expressions

为了娱乐,假设我们要使用c语言比较两个格式为instance的数字,并且我们只能使用使用算术运算符statestate的数学方程式,并且Buttons检查等于(import os import pathlib import glob def main(): replacement = "New" oldTex = "Old" baseFolder = '1.5.13_test_2' fullPath = "/Users/gfKron/path" for item in glob.glob(fullPath +"/*.json", recursive=True): temp = [] with open(item, "r") as f: for line in f: line.replace(oldTex, replacement) temp.append(line) with open(item, "w") as f: f.writelines(temp) f.close() if __name__== "__main__": main() ),小于(double)和大于(+, -, *, /, %)。类似于真实的关系运算符fabs(),我们编写的代码必须为每种不同的检查返回True(pow())或False(==)。

例如,如果我们确定两个变量<>==, <, and >1和{{1} 0相等,我们应该返回True或1,否则返回False或0。最好返回整数0和1,而不是布尔值True和False。为了使事情复杂化,我们不能使用真实的关系运算符,逻辑运算符,按位运算符或任何其他运算符。此外,我们不能使用switch语句或条件语句。怎么做?

我知道如何找到x和y的较小值,也就是说+, -, *, /, %可以计算为fabs()。此外,要找到pow(),它是a。但是,这些方程式根据比较方程式返回值x或y,我需要它们返回0或1。类似地,如果x和y相等,我需要一些代码方程式返回0或1({{1} }),并且只能使用bx < y((x + y) + fabs(x-y))/2

1 个答案:

答案 0 :(得分:1)

应用于+, -, *, /操作数的任何给定运算符double都会得到double以及fabs()pow()函数。因此,仅使用提供的运算符以及doubleinteger函数就无法将fabs()转换为pow()

此外,%运算符仅适用于整数。有一个fmod()函数,为浮点数提供相同的功能。

我们可以实现,仅使用提供的运算符和函数,我们的计算结果将以相同的方式在内存中表示为整数0和1。

例如,这些功能是为float而创建的,即32位浮点数:

    float largerOf(float x, float y){
        return ((x + y) + fabs(x-y)) / 2.0;
    }

    float smallerOf(float x, float y){
        return ((x + y) - fabs(x-y)) / 2.0;
    }

    int isEqual(float x, float y){
        float tmp = smallerOf(x, y) / largerOf(x, y);
        tmp /= 3.4028235E38;
        tmp /= 4194303.9999999997;
        return *((int*)(&tmp));
    }

    int lessThan(float x, float y){
        float tmp = smallerOf(x, y) / x;
        tmp /= 3.4028235E38;
        tmp /= 4194303.9999999997;
        return (*((int*)(&tmp)))-isEqual(x,y);
    }

    int greaterThan(float x, float y){
        float tmp = smallerOf(x, y) / y;
        tmp /= 3.4028235E38;
        tmp /= 4194303.9999999997;
        return (*((int*)(&tmp)))-isEqual(x,y);
    }

此解决方案使用以下事实:两个值中的较小者除以两个值中的较大者将导致值小于或等于1.0。然后,除法运算后的结果值将再次用两个硬编码常数除以尝试获得且仅当第一个除法的结果正好是1.0时才设置了最右边的浮点数。毕竟,我们访问包含浮点数的内存,就好像它包含整数结果一样。


请注意,此解决方案未经良好测试,并可能以许多不同方式出现异常。例如,值2.01.9999993表现良好,但是尽管32位浮点数可以表示值2.01.99999941.9999993相等,但认为1.99999942.0相等。 async.autoInject,它们和async.waterfall([ cb => { cb(null, "one", "two"); }, (one, two, cb) => { cb(null, 1, 2, 3, 4); }, (one,two,three,four,cb) => { // ... } ]) 都是有区别的。