6-9 sgn函数模板
分数 10
全屏浏览
切换布局
作者 王政
单位 山东大学
符号函数在数学和工程中很常用,对于参数x
它的结果如下:
- 当
x
大于0时返回+1 - 当
x
小于0时返回-1 - 当
x
等于0时返回0
你可能迅速地写出int sgn(int x) { return x == 0 ? 0 : (x > 0 ? 1 : -1); }
,但有几方面的缺陷:
- C++有多种整数类型
signed char, short, int, long, long long
和浮点类型float, double, long double
等,为每种类型各写一份sgn(x)
乏味透顶,并且类型扩展没有尽头:__int128, __float128, …
- 希望支持OOP自定义类,但又不想对类作过多要求。比如上面的
sgn()
需要数据类型具备==
和>
两种算符,我们争取只需类定义小于关系。 - 浮点类型不宜直接比较。通常做法是指定容限(epsilon),与0接近到容限以内就近似为0。于是把符号函数设计为两个参数:
sgn(x, eps)
函数接口定义:
// 请用函数模板实现符号函数的功能。
sgn
函数模板的类型参数为T
,T
类型需要支持<
算符。形式参数有两个:x
、eps
,类型都是T
,其中eps
表示容限,整型容限通常为0。返回值类型固定为int
。
测试程序样例:
// 模板实现
#include <iostream>
using namespace std;
int main() {
cout << sgn(0, 0) << endl;
cout << sgn(1, 0) << endl;
cout << sgn(-1, 0) << endl;
cout << sgn('a', '\0') << endl;
cout << sgn((short)-2, (short)0) << endl;
cout << sgn(2L, 0L) << endl;
cout << sgn(-3LL, 0LL) << endl;
cout << sgn(0.0, 1e-9) << endl;
cout << sgn(1e-9, 1e-9) << endl;
cout << sgn(-1e-9, 1e-9) << endl;
cout << sgn(1.1e-9, 1e-9) << endl;
cout << sgn(-1.1e-9, 1e-9) << endl;
cout << sgn(0.0f, 1e-9f) << endl;
cout << sgn(1e-9f, 1e-9f) << endl;
cout << sgn(-1e-9f, 1e-9f) << endl;
cout << sgn(1.1e-9f, 1e-9f) << endl;
cout << sgn(-1.1e-9f, 1e-9f) << endl;
}
输入样例:
在这里给出一组输入。例如:
输出样例:
在这里给出相应的输出。例如:
0
1
-1
1
-1
1
-1
0
0
0
1
-1
0
0
0
1
-1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
template <typename T>
int sgn(T x,T eps){ return (x>=0&&x<=eps)||(x<=0&&x>=(-eps)) ? 0 :x>0 ? 1 : -1;}