巧记斜边函数hypot
hypot是一个数学函数,源于英文"hypotenuse(斜边)",hypot(a, b)返回直角边边长为a、b的直角三角形(right-angled triangle)的斜边长度。该函数定义在<math.h>头文件中,其功能相当于sqrt(a*a + b*b)。
函数原型:double hypot( double x, double y );
示例代码如下:
#include<stdio.h>
#include<math.h>
double dist(double x1, double y1, double x2, double y2){
//此代码可替代下面3行代码:return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
double dx = x1-x2;
double dy = y1-y2;
return hypot(dx, dy);
}
int main(){
double x1=9, y1=5, x2=2, y2=7, y;
y=dist(x1, y1, x2, y2); //调用函数
printf("%f\n", y);
return 0;
}
网上说相比sqrt,hypot可能会使用更精确的算法来避免精度损失,老金试了不少数结果都是一样。
比如将输入值设为:x1=9999, y1=5555, x2=2222, y2=7777
结果:
hypot里的两个参数可以颠倒,也可以为负数,结果不变。这是个数学问题,很好理解。
这个函数的用法没什么难的,关键是hypot、hypotenuse看着比较生分,不太好记。不像sqrt这种使用频比较高的,根本不用记。
当你想秀一下求斜边的神技时,却想不起来怎么写,是不是很尴尬?
从词源来说,hypotenuse是由hypo和tenuse两部分组成所。hypo是个前缀,指“under下面”,tenuse和tense很像,其实它俩是同源的,都来自词根tend,指“stretch延伸”。
什么叫向下延伸呢?不好理解,也不好记,咱们可以找个实物代表一下。最典型的就是水流,高山流水,自上而下,简称“下流”——“下”对应under,“流”对应stretch。要打造这种景观,就需要有一个“斜坡”,而直角形的斜边就类似这样一个斜坡。
不过搞明白这个道理你不一定能记住这个单词,因为中间有断层:hypo为什么是under?tenuse怎么就有延伸的意思?
老金解释不了,这是语言千百年进化的结果。
所以这个单词用词根词缀也未必好记,倒不如直接使用联想记忆:
hypotenuse:hy怀疑(拼音首字母)+ po婆+ten十+use用
→我怀疑这个婆娘被十个人用过了
→我把这个人想“歪”了,我认为她走了“斜”路
→斜边
那么hypotenuse的阉割版hypot呢,也可以照猫画虎:
hypot:hy怀疑+ po婆+t蹄
→我怀疑这个婆娘的蹄子下面垫了增高垫(或者是穿了高跟鞋)
→增高垫是斜面、脚面是斜面
→斜边
或者还可以这样:
hypotenuse:h黄老邪+ y摇+pot壶
→黄老邪摇摇晃晃地对着酒壶喝酒
→人也斜、壶也斜、酒也斜
→斜边