【C++】6-9 sgn函数模板分数 10

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函数模板的类型参数为TT类型需要支持<算符。形式参数有两个:xeps,类型都是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;}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值