NAME
perlnumber - Perl 中 数 字 的 语 义 以 及 算 术 操 作
SYNOPSIS 总 览
$n = 1234; # 十 进 制 数 $n = 0b1110011; # 二 进 制 数 $n = 01234; # 八 进 制 数 $n = 0x1234; # 十 六 进 制 数 $n = 12.34e-56; # 指 数 形 式 $n = "-12.34e56"; # 用 字 符 串 描 述 的 数 $n = "1234"; # 用 字 符 串 描 述 的 数
DESCRIPTION 描 述
这 篇 文 章 描 述 了 Perl内 部 是 怎 样 处 理 数 的 数 值 的 。 在 这 里 不 会 提 到 Perl的 运 算 符 重 载 机 制 , 运 算 符 重 载 允 许 用 户 自 定 义 对 数 的 操 作 , 例 如 对 任 意 大 的 整 型 数 或 者 任 意 精 度 的 浮 点 数 进 行 的 操 作 , 或 者 一 些 其 它 的 算 术 类 型 如 求 模 操 作 和 p-adic操 作 等 等 。 要 想 知 道 运 算 符 重 载 的 细 节 , 请 看 重 载 。
Storing numbers 数 值 存 储
Per在 内 部 能 用 三 种 方 法 表 示 数 值 : 用 “Native整 型 ”, “Native浮 点 型 ”或 是 用 十 进 制 形 式 的 字 符 串 。 其 中 十 进 制 字 符 串 可 以 带 一 个 指 数 描 述 的 部 分 , 就 像 "12.34e-56"。 在 这 里 术 语 Native的 含 义 是 用 于 编 译 perl 的 C 编 译 器 所 支 持 的 类 型 。 在 我 们 谈 及 整 型 时 , "native"这 个 术 语 所 包 含 的 含 义 比 我 们 谈 论 浮 点 数 时 要 少 一 些 。 对 "native"整 型 来 说 , 这 个 术 语 所 的 含 义 仅 仅 是 指 整 型 数 的 可 以 有 最 大 值 和 最 小 值 会 是 2的 某 次 方 , 而 对 "native"浮 点 数 来 说 , 有 一 条 基 本 的 限 制 就 是 它 只 能 表 示 那 些 能 用 有 限 几 位 二 进 制 小 数 所 表 示 的 实 数 。 举 例 来 说 , 0.9就 不 是 "native"浮 点 数 , 因 为 0.9用 二 进 制 小 数 表 示 是 有 无 穷 多 位 的 : 二 进 制 0.1110011001100... 序 列 1100 将 无 休 止 的 循 环 下 去 。 除 了 这 条 限 制 以 外 , 二 进 制 浮 点 数 在 用 指 数 型 式 表 达 时 也 存 有 限 制 。 在 特 定 的 硬 件 条 件 下 , 浮 点 型 的 数 可 以 存 储 最 多 53位 二 进 制 数 再 加 上 范 围 从 -1024到 1024的 指 数 值 (译 者 : -1024到 1024用 11位 二 进 制 数 , 加 上 53等 于 64, 就 是 说 这 里 用 用 64位 存 一 个 浮 点 数 ) 转 换 成 十 进 制 也 就 是 说 差 不 多 能 用 16位 有 效 数 字 和 从 -304到 304的 指 数 值 和 起 来 表 示 一 个 浮 点 数 。 这 种 表 示 方 法 的 一 种 结 果 就 是 我 们 不 可 能 在 不 损 失 精 度 的 情 况 下 用 浮 点 型 存 储 像 12345678901234567这 样 的 数 。 类 似 的 , 十 进 制 字 符 串 也 只 能 表 示 有 限 位 数 的 十 进 制 数 .光 就 字 符 串 来 言 ,它 可 以 是 任 意 长 度 的 ,没 有 什 么 关 于 指 数 或 有 效 数 字 位 数 上 的 限 制 .(但 是 请 意 识 到 我 们 正 在 讨 论 的 存 放 数 值 的 那 些 规 则 .事 实 是 你 能 用 字 符 串 存 放 很 大 的 数 值 并 不 代 表 相 应 的 数 值 操 作 能 够 把 字 符 串 中 的 所 有 的 数 位 都 用 上 .欲 知 详 情 ,请 看 "数 值 运 算 符 和 数 值 转 换 " 事 实 上 “Native整 型 数 ”存 储 的 数 值 可 以 是 带 符 号 的 , 或 者 是 不 带 符 号 的 。 所 以 很 典 型 的 , Perl中 “Native整 型 数 ”可 以 表 示 的 整 数 的 范 围 是 -2**31..2**32-1, 这 个 范 围 对 64位 的 整 数 来 说 是 比 较 合 适 的 。 但 这 并 不 意 味 着 Perl只 能 处 理 这 个 范 围 内 的 整 数 : 浮 点 类 型 可 以 存 下 更 大 的 整 数 。 总 而 言 之 , Perl中 的 数 是 有 限 位 数 的 十 进 制 数 或 者 说 是 足 够 短 的 二 进 制 数 。
Numeric operators and numeric conversions 数 值 运 算 符 和 数 值 转 换
就 像 前 面 说 的 那 样 , Perl可 以 用 三 种 格 式 中 的 任 意 一 种 存 放 一 个 数 , 但 是 大 多 数 运 算 符 只 能 理 解 这 三 种 格 式 中 的 一 种 。 当 一 个 数 值 作 为 参 数 传 给 一 个 运 算 符 时 , 它 将 会 被 转 换 成 运 算 符 可 以 理 解 的 那 种 格 式 。 可 能 出 现 的 转 换 有 下 面 六 种 :
native 整 型 --> native 浮 点 型 (*) native 整 型 --> 十 进 制 形 式 的 字 符 串 native 浮 点 型 --> native 整 型 (*) native 浮 点 型 --> decimal string (*)十 进 制 的 字 符 串 --> native 整 型十 进 制 的 字 符 串 --> native 浮 点 型 (*)这 些 转 换 按 照 下 列 的 规 则 进 行 :
• 如 果 原 来 的 数 可 以 用 要 转 换 成 的 格 式 表 述 , 则 其 值 继 续 使 用 , 不 会 改 变 。 | |
• 如 果 原 来 的 数 超 出 了 要 转 换 成 的 格 式 所 能 表 述 的 极 限 , 则 最 接 近 极 限 的 那 个 值 会 被 用 来 做 最 后 的 值 。 ( 这 会 有 信 息 上 的 损 失 ) | |
• 如 果 原 来 的 数 在 要 转 换 成 的 格 式 所 能 表 述 的 两 个 相 邻 的 数 之 间 , 则 这 两 个 数 中 的 一 个 会 被 用 来 做 最 后 的 值 。 ( 这 会 有 信 息 上 的 损 失 ) | |
• 在 |
"native 浮 点 型 --> native 整 型 " 的 转 换 中 , 结 果 的 值 小 于 等 于 原 来 的 值 。 ( 因 为 是 直 接 截 取 小 数 位 取 整 的 ) ("Rounding to zero".)
• 如 果 |
"十 进 制 的 字 符 串 --> native 整 型 " 的 转 换 不 能 在 不 损 失 信 息 的 情 况 |
下 完 成 , 结 果 将 会 和 下 列 的 转 换 序 列 的 结 果 一 致 : "十 进 制 的 字 符 串 --> native_浮 点 型 --> native_整 型 ". 特 别 要 指 出 的 是 , 尽 管 像 "0.99999999999999999999" 这 样 的 数 可 能 会 取 整 成 1, 取 整 一 般 是 倾 向 于 0的 。 限 制 : 上 面 标 有 "(*)" 的 转 换 包 含 有 C编 译 器 的 动 作 步 骤 。 在 特 殊 情 况 下 , C编 译 器 的 一 些 特 性 或 者 Bugs可 能 会 导 致 上 述 一 些 规 则 的 不 成 立 。
Flavors of Perl numeric operations 数 值 操 作 的 特 色
Perl 中
带 有 数 值 参 数
的 操 作 将 按 照
四 种 方 法 处 理
参 数 : 它 们 可
能 会 将 参 数 强
制 转 换 为 整 型
, 浮 点 型 或 是
字 符 串 型 中 的
一 种 , 或 者 按
照 操 作 数 的 格
式 来 处 理 参 数
。 在 把 一 个 数
的 类 型 强 制 转
换 成 另 一 种 特
定 的 类 型 的 过
程 中 , 原 来 存
储 的 值 不 会 改
变 。 所 有 需 要
整 型 数 作 参 数
的 运 算 符 会 对
参 数 进 行 取 模
的 操 作 。 比 如
说 用 32位 存 放 整
型 数 时 会 把 数
对 2的 32次 方 取 模
("mod 2**32"), 所 以
"sprintf "%u", -1" 的
结 果 和 "sprintf "%u",
~0" 的 结 果 是 一
样 的 。
Arithmetic operators 算 术 运 算
符 二 进 制 运 算
符 "+" "-" "*"
"/" "%" "==" "!="
">" "<" ">="
"<=" 以 及 一 元
运 算 符 "-"
"abs" and "--" 总
试 图 将 参 数 转
换 为 整 形 。 如
果 转 换 都 可 以
无 损 精 度 地 进
行 , 并 且 运 算
也 无 损 于 精 度
, 那 么 返 回 整
数 的 结 果 。 否
则 , 参 数 被 转
换 为 浮 点 数 ,
返 回 浮 点 数 结
果 。 转 换 的 缓
冲 过 程 保 证 了
整 数 转 换 不 会
将 浮 点 数 的 零
头 丢 掉
++ |
"++" 的 行 为 与 其 他 操 作 符 类 似 , 但 是 如 果 操 作 数 是 满 足 "/^[a-zA-Z]*[0-9]*\z/" 格 式 的 字 符 串 , 将 进 行 perlop 中 描 述 的 字 符 串 递 增 运 算 。 |
定 义 了
"use integer"
时 的 算 术 运 算
在 "use integer;" 的 作
用 范 围 内 , 几
乎 上 面 列 出 的
所 有 操 作 符 都
将 它 们 的 操 作
数 转 换 为 整 数
, 返 回 整 数 的
结 果 , 例 外 情
况 是 "abs",
"++" 和
"--", 在 这 种
情 况 下 不 改 变
行 为 。
Other mathematical operators 其 他 数
学 操 作 符 类 似
"**", "sin" 和
"exp" 的 操 作 符
强 制 参 数 为 浮
点 格 式 。
Bitwise operators 位 操 作 符
如 果 不 是 字 符
串 , 操 作 数 被
强 制 转 换 为 整
型 定 义 了
"use integer" 时 的 位 运
算 强 制 参 数 为
整 型 。 并 且 ,
移 位 操 作 在 内
部 使 用 有 符 号
整 型 而 不 是 默
认 的 无 符 号 数
需 要 整 型 操 作
数 的 操 作 符 强
制 操 作 数 转 换
为 整 型 。 例 如
, 在 函 数
"sysread" 的 第 三
和 第 四 个 参 数
中 , 这 样 做 是
合 适 的 。 需 要
字 符 串 的 操 作
符 强 制 操 作 数
为 字 符 串 格 式
。 例 如 , 在
"printf "%s", $value" 中
, 这 样 做 是 合
适 的 。 尽 管 强
制 转 换 参 数 为
特 定 格 式 不 会
改 变 已 存 储 的
数 字 , Perl 会 记 录
转 换 的 结 果 。
特 别 的 , 尽 管
第 一 次 转 换 会
耗 费 一 定 时 间
, 重 复 进 行 的
操 作 不 会 需 要
重 新 转 换 。
AUTHOR 作 者
Ilya Zakharevich "ilya [AT] math.edu" 由 Gurusamy Sarathy <gsar [AT] ActiveState.com> 编 辑 由 Nicholas Clark <nick [AT] ccl4.org> 更 新 为 5.8.0 版
SEE ALSO 参 见
overload, perlop
跋
本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh