题目
编写程序,根据数学定义手写实现符号函数 $\text{sgn}(x)$(当 $x > 0$ 时为 1;$x = 0$ 时为 0;$x < 0$ 时为 -1),并与 Octave 内置的 <code>sign()</code> 函数对比验证。
输入格式:一行输入一个浮点数。
输出格式:分别打印手写分支求得的符号值与内置 sign() 函数的计算结果。
数据范围与约定:实数数值。
思路与算法
1. 数学定义
$\text{sgn}(x) = 1$ ($x>0$), $0$ ($x=0$), $-1$ ($x<0$)。
2. 内置向量化 sign
内置 sign(x) 不仅支持标量,而且无缝支持任意多维矩阵的逐元素符号提取,甚至支持复数符号 $\text{sign}(z) = z / |z|$。
3. 浮点零容差
判断是否为零时考虑浮点容差 abs(x) < 1e-12。
完整程序
% Octave / MATLAB 第46题:符号函数手写与对比
[x, count] = scanf("%f", 1);
if count < 1
fprintf("错误:未输入数值。\n");
return;
end
% 手写多分支实现
if x > 1e-12
s_manual = 1;
elseif x < -1e-12
s_manual = -1;
else
s_manual = 0;
end
% 内置函数实现
s_builtin = sign(x);
fprintf("输入 x: %.4f\n", x);
fprintf("手写实现 sgn(x): %d\n", s_manual);
fprintf("内置函数 sign(x): %d\n", s_builtin);运行示例
示例 1:
输入:
-15.8输出:
输入 x: -15.8000
手写实现 sgn(x): -1
内置函数 sign(x): -1示例 2:
输入:
0输出:
输入 x: 0.0000
手写实现 sgn(x): 0
内置函数 sign(x): 0示例 3:
输入:
42.3输出:
输入 x: 42.3000
手写实现 sgn(x): 1
内置函数 sign(x): 1