这是命令 perlnumber,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
perlnumber - Perl 中数字和数值运算的语义
概要
$n = 1234; #十进制整数
$n = 0b1110011; # 二进制整数
$n = 01234; #八进制整数
$n = 0x1234; # 十六进制整数
$n = 12.34e-56; # 指数符号
$n = "-12.34e56"; # 指定为字符串的数字
$n = "1234"; # 指定为字符串的数字
商品描述
本文档描述了 Perl 如何在内部处理数值。
Perl 的运算符重载功能在这里完全被忽略。 运算符重载
允许对数字进行用户定义的行为,例如对任意大的操作
整数、任意精度的浮点数、“异国情调”运算
数,例如模算术或 p-adic 算术等。 请参阅重载
细节。
储存 数字
Perl 可以用 3 种不同的方式在内部表示数字:作为本机整数,作为本机
浮点数和十进制字符串。 十进制字符串可能有指数
符号部分,如“12.34e-56”。 本地人 这里的意思是“C 编译器支持的格式
用于构建 perl”。
当我们谈论本机整数时,术语“本机”的意义并不大,因为它
当涉及本机浮点数时会这样做。 该术语的唯一含义
整数上的“本机”是支持的最大值和最小值的限制为真
积分量接近 2 的幂。但是,“原生”浮点数具有最大的
基本限制:它们只能代表那些具有相对
转换为二进制分数时的“短”表示。 例如,0.9 不能是
由原生浮点数表示,因为 0.9 的二进制分数是无限的:
二进制0.1110011001100...
序列 1100 一次又一次地重复。 除了这个限制,
二进制数的指数在表示为浮点数时也受到限制
点数。 在典型的硬件上,浮点值最多可以存储 53
二进制数字,二进制指数介于 -1024 和 1024 之间。十进制
表示这接近 16 位十进制数字和范围内的十进制指数
-304..304。 所有这一切的结果是 Perl 不能存储像
12345678901234567 作为此类架构上的浮点数而不会丢失
信息。
同样,十进制字符串只能表示那些具有有限小数的数字
扩张。 作为字符串,因此具有任意长度,没有实际限制
这些数字的指数或小数位数。 (但要意识到我们是什么
只讨论规则 存储 这些数字中。 你可以存储的事实
如此“大”的数字并不意味着 操作 在这些数字上将使用所有
有效数字。 有关详细信息,请参阅“数字运算符和数字转换”。)
事实上,以本机整数格式存储的数字可以存储在有符号的
本机形式,或未签名的本机形式。 因此,Perl 数字的限制存储为
本机整数通常是 -2**31..2**32-1,在
64 位整数的情况。 同样,这并不意味着 Perl 只能在
此范围内的整数:可以在浮点数中存储更多整数
格式。
总结一下,Perl 数值只能存储那些具有有限小数的数字
扩展或“短”二进制扩展。
数字 运营商 和 数字 转换
如前所述,Perl 可以以三种格式中的任何一种存储数字,但大多数
操作员通常只理解这些格式中的一种。 传递数值时
作为此类运算符的参数,它将被转换为
运营商。
六种这样的转换是可能的:
本机整数 --> 本机浮点数 (*)
本机整数 --> 十进制字符串
本机浮点数 --> 本机整数 (*)
本机 float_point --> 十进制字符串 (*)
十进制字符串 --> 本机整数
十进制字符串 --> 原生浮点数 (*)
这些转换受以下一般规则约束:
· 如果源编号可以用目标形式表示,则该表示为
用过的。
· 如果源编号超出目标格式中可表示的限制,则
使用最接近极限的表示。 (损失 of 信息)
· 如果源编号在目标格式中可表示的两个数字之间,则一个
使用这些数字之一的表示。 (损失 of 信息)
· 在“本机浮点数 --> 本机整数”中转换结果的大小
小于或等于源的大小。 (“四舍五入 至 零”。)
· 如果“十进制字符串-->原生整数”转换不能不丢失
信息,结果与转换序列“decimal_string -->
native_floating_point --> native_integer"。特别是,舍入有很强的偏差
到 0,虽然像“0.99999999999999999999”这样的数字有可能被四舍五入到
1.
限制: 上面标有“(*)”的转换涉及由 C 执行的步骤
编译器。 特别是,所使用的编译器的错误/功能可能会导致某些
上述规则中。
香精香料 of Perl的 数字 操作
采用数字参数的 Perl 操作以四种不同的方式之一处理该参数
方式:他们可能会强制它使用整数/浮点/字符串格式之一,或者他们可能会表现
根据操作数的格式不同。 将数值强制为
特定格式不会更改存储在值中的数字。
所有需要整数格式参数的运算符都将参数视为
模算术,例如,2 位架构上的“mod 32**32”。 "sprintf "%u", -1"
因此提供与 "sprintf "%u", ~0" 相同的结果。
算术运算符
二元运算符 "+" "-" "*" "/" "%" "==" "!=" ">" "<" ">=" "<=" 和一元运算符
运算符“-”、“abs”和“--”将尝试将参数转换为整数。 如果两者
可以在不损失精度的情况下进行转换,并且可以执行操作
不损失精度,则使用整数结果。 否则参数是
转换为浮点格式并使用浮点结果。 缓存
转换次数(如上所述)意味着整数转换不会抛出
去掉浮点数的小数部分。
++ "++" 的行为与上面的其他运算符相同,但如果它是匹配
格式 "/^[a-zA-Z]*[0-9]*\z/" 使用 perlop 中描述的字符串增量。
“使用整数”期间的算术运算符
在“使用整数;”的范围内生效后,几乎所有上面列出的运营商都将
强制它们的参数为整数格式,并返回整数结果。 这
例外,“abs”,“++”和“--”,不会用“use integer;”改变它们的行为。
其他数学运算符
“**”、“sin”和“exp”等运算符将参数强制为浮点格式。
按位运算符
如果不是字符串,参数将被强制为整数格式。
“使用整数”期间的按位运算符
强制参数为整数格式。 也在内部使用签名的移位操作
整数而不是默认的无符号。
期望整数的运算符
强制参数为整数格式。 这适用于第三和
例如,“sysread”的第四个参数。
期望字符串的运算符
强制参数为字符串格式。 例如,这适用于“printf
"%s", $value"。
尽管将参数强制转换为特定形式不会改变存储的数字,但 Perl
记住这种转换的结果。 特别是,虽然第一次这样的转换
可能很耗时,重复操作将不需要重做转换。
使用 onworks.net 服务在线使用 perlnumber