平方一个数但保留符号(在c语言中)

3

有没有一种简单的方法,可以在对一个值进行平方后保留符号。我目前有以下代码:

float signed_square(float x) {
    if (x > 0) {
        return x * x;
    } else {
        return -(x * x);
    }
}

6
但那没有意义!!负数的平方是正数! - Mitch Wheat
9
@Tommy,我认为您可以更简单一些:x * abs(x) - druckermanly
基本上,你必须想办法自己保存符号,因为没有定义的数学运算可以平方该数字并保留符号。要么先保存它,再进行平方,然后重新应用它,要么使用上面提到的“abs”技巧之一。(请注意,你的原始代码可能与其他方法一样有效率。) - Hot Licks
2
我不会像其他评论者那样说你的要求毫无意义。你想做什么是非常清楚的。但我很好奇你为什么想做这件事情。它有什么用处呢?顺便说一句,我认为你在问题中提出的版本没有任何问题;使用 fabs 在我看来并不能改进它。 - Keith Thompson
我正在尝试制作一个AIS解码器,其中规格的一部分称:“当平方字段值时,应保留其符号,否则左/右指示将丢失。”(http://catb.org/gpsd/AIVDM.html)我希望这样可以澄清为什么我想要这样做。 - Saspiron
显示剩余5条评论
2个回答

12

正如我在评论中所说:

float signed_square(float x){
    return x * fabs(x);
}

那需要使用 fabs() 还是 fabsf() 呢?abs() 不是整数函数吗? - Jonathan Leffler
你是正确的 - 我错误地将我的 C++ STL 放入了我的 C 思维模式中。 - druckermanly
2
(+1),但应该是 fabsf - ouah
我认为问题中的版本更加直观。 - Keith Thompson

3

C99提供double copysign(double x, double y)

copysign函数生成一个具有x的绝对值和y的符号的值。

float signed_square(float x) {
  return copysignf(x*x, x);
}

@AaronFranke 性能因平台和编译器而异 - 因此没有明确的性能评估。重要部分是平方运算,好的编译器应该能够看到 x*x 并为其生成高效的代码。考虑尝试各种方法并查看您获得的性能。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接