Manpages

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