rpntutorial - 云端在线

这是命令 rpntutorial,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


rpntutorial - Steve Rader 阅读 RRDtool RPN 表达式

商品描述


本教程将帮助您掌握 CDEF 中所见的 RRDtool RPN 表达式
RRDtool 图的参数。

阅读 竞品对比 运营商


LT、LE、GT、GE 和 EQ RPN 逻辑运算符并不像看起来那么棘手。 这些
运算符作用于它们前面(左侧)堆栈中的两个值。 读这两个
堆栈上的值从左到右在中间插入运算符。 如果
结果语句为真,然后用“1”替换堆栈中的三个值。 如果
该语句如果为假,则将三个值替换为“0”。

例如,考虑“2,1,GT”。 这个 RPN 表达式可以读作“是两个更大的
比一个?”这个问题的答案是“真”。所以这三个值应该被替换
与“1”。 因此 RPN 表达式 2,1,GT 的计算结果为 1。

现在考虑“2,1,LE”。 这个 RPN 表达式可以读作“是两个小于或等于
一个?”。自然的反应是“否”,因此 RPN 表达式 2,1,LE 的计算结果为 0。

阅读 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 IF 操作者


IF RPN 逻辑运算符也可以很简单。 阅读 IF 运算符的关键是
理解传统的“if X than Y else Z”符号的条件部分有
*已经*进行了评估。 因此 IF 运算符仅作用于堆栈中的一个值:
IF 值左侧的第三个值。 IF 左侧的第二个值
对应于真正的(“Y”)分支。 以及 IF 左侧的第一个值
对应于假(“Z”)分支。 从左到右阅读 RPN 表达式 "X,Y,Z,IF"
就像这样:“如果 X 则 Y 否则 Z”。

例如,考虑“1,10,100,IF”。 对我来说看起来很奇怪。 但是当我读到“如果 1 那么
10 else 100" 很清楚:1 是真的,所以答案是 10。请注意,只有零是
错误的; 所有其他值都为真。 "2,20,200,IF" ("if 2 then 20 else 200") 评估为
20. "0,1,2,IF" ("if 0 then 1 else 2) 求值为 2。

请注意,以上示例都没有真正模拟整个“if X then Y else Z”
陈述。 这是因为计算机程序员将此语句读作“如果某些条件
然后是 Y else Z”。所以能够读取 IF 运算符以及 LT、LE、
GT、GE 和 EQ 运算符。

例子


虽然复合表达式可能看起来过于复杂,但它们可以被认为是优雅的
简单的。 要快速理解 RPN 表达式,您必须了解求值算法
RPN 表达式:从左到右迭代搜索以寻找运算符。
找到后,通过弹出运算符和一些值来应用该运算符
(根据定义,不是运算符)脱离堆栈。

例如,堆栈“1,2,3,+,+”在第一次被评估为“2,3,+”(作为“2+3”)
迭代并被 5 替换。这导致堆栈“1,5,+”。 最后,“1,5,+”是
计算得出答案 6。为方便起见,编写这组
操作如下:

1) 1,2,3,+,+ eval 是 2,3,+ = 5 结果是 1,5,+
2) 1,5,+ eval 是 1,5,+ = 6 结果是 6
3)6

让我们使用该符号来方便地解决一些具有多个复杂 RPN 表达式的问题
逻辑运算符:

1) 20,10,GT,10,20,IF eval 为 20,10,GT = 1 结果为 1,10,20,IF

将 eval 读作 pop“20 大于 10”,所以按 1

2) 1,10,20,IF eval 为 1,10,20,IF = 10 结果为 10

阅读 pop "if 1 then 10 else 20" 所以按 10。只剩下 10,所以 10 是答案。

让我们阅读一个复杂的 RPN 表达式,它也具有传统的乘法运算符:

1) 128,8,*,7000,GT,7000,128,8,*,IF eval 128,8,* 结果是 1024
2) 1024 ,7000,GT,7000,128,8,*,IF eval 1024,7000,GT 结果为 0
3) 0, 7000,128,8,*,IF eval 128,8,* 结果是 1024
4) 0, 7000,1024, IF 结果是 1024

现在让我们回到多个逻辑运算符的第一个示例,但替换值
20 带有变量“输入”:

1) input,10,GT,10,input,IF eval is input,10,GT (让我们称之为 A )

将 eval 读作“if input > 10 then true”并将“input,10,GT”替换为“A”:

2) A,10,input,IF eval 是 A,10,input,IF

阅读“if A then 10 else input”。 现在再次用它的详细描述替换 A
并且——瞧!——你有一个易于阅读的表达式描述:

如果输入 > 10 然后 10 否则输入

最后,让我们回到第一个最复杂的例子并将值 128 替换为
“输入”:

1) input,8,*,7000,GT,7000,input,8,*,IF eval input,8,* 结果是A

其中 A 是“输入 * 8”

2) A,7000,GT,7000,input,8,*,IF eval 为 A,7000,GT 结果为 B

其中 B 是“如果 ((input * 8) > 7000) then true”

3) B,7000,input,8,*,IF eval 为 input,8,* 结果为 C

其中 C 是“输入 * 8”

4) B,7000,C,如果

最后,我们有了一个带有变量的复杂 RPN 表达式的可读解码:

if ((input * 8) > 7000) then 7000 else (input * 8)

演习


练习1:

手工计算 "3,2,*,1,+ 和 "3,2,1,+,*"。用传统符号重写它们。
解释为什么他们有不同的答案。

答1:

3*2+1 = 7 和 3*(2+1) = 9。这些表达式有
不同的答案,因为加号和
time 操作符会改变它们的计算顺序。

练习2:

人们可能会想缩短表达式

输入,8,*,56000,GT,56000,输入,*,8,IF

通过删除“input,8,*”的冗余使用,如下所示:

输入,56000,GT,56000,输入,IF,8,*

使用传统的符号来表示这些表达方式是不一样的。 写一个表达式
这相当于第一个表达式,但使用 LE 和 DIV 运算符。

答2:

if (input <= 56000/8 ) { input*8 } else { 56000 }
输入,56000,8,DIV,LE,输入,8,*,56000,IF

练习3:

简要解释为什么传统的数学符号需要使用括号。
解释为什么 RPN 表示法不需要使用括号。

答3:

传统的数学表达式由
先做乘除,然后加和
减法。 括号用于强制评估
乘法之前的加法(等)。 RPN 不需要
括号是因为堆栈上的对象的顺序
可以强制在乘法之前评估加法。

练习4:

解释为什么 RRDtool 开发人员需要实现 RPN 表示法
传统的数学符号。

答4:

实现传统数学的算法
符号比用于 RPN 的算法更复杂。
所以实施 RPN 让 Tobias Oetiker 写得更少
代码! (代码也不太复杂,因此更少
可能有错误。)

使用 onworks.net 服务在线使用 rpntutorial



最新的 Linux 和 Windows 在线程序