题目

编写程序,根据数学定义手写实现符号函数 $\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