Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math (骗局/方案)减法产生的结果非常小_Math_Floating Point_Lisp_Scheme_Precision - Fatal编程技术网

Math (骗局/方案)减法产生的结果非常小

Math (骗局/方案)减法产生的结果非常小,math,floating-point,lisp,scheme,precision,Math,Floating Point,Lisp,Scheme,Precision,我现在在胡搞“”-使用Scheme/Racket;我在Scheme的R5RS版本中遇到了一个非常独特的特性 在进行简单的减法运算时,尽管使用的是带有小数点accurace的值,但结果与预期相差很小 比如,;给定以下减法运算: (- 5.00 4.90) => 0.09999999999999965 当一个人应该期待一个干净的0.10?整数减法按预期工作 > (- 5 4) => 1 > (- 5 4.9) => 0.09999999999999965 例如,

我现在在胡搞“”-使用Scheme/Racket;我在Scheme的R5RS版本中遇到了一个非常独特的特性

在进行简单的减法运算时,尽管使用的是带有小数点accurace的值,但结果与预期相差很小

比如,;给定以下减法运算:

(- 5.00 4.90)
=> 0.09999999999999965
当一个人应该期待一个干净的0.10?整数减法按预期工作

> (- 5 4)
 => 1
> (- 5 4.9)
 => 0.09999999999999965
例如,练习3.1.1

下一步是为每个函数编写示例。确定有多少观众能够以3美元、4美元和5美元的票价购买一场演出。使用这些示例制定一个通用规则,说明如何根据票价计算与会者人数。如果需要,多举一些例子

示例中的规则是,票价每降低0.10美元,就会有15人参加。这样一个快速的函数就行了

(define (attendees ticket-price)
  (+ 120 (* (/ (- 5.00 ticket-price) 0.10) 15)))
但是,这会返回(相当烦人的)

因此,在尝试了教科书中的(几乎完全相同的)解决方案之后

(define (attendance price)
  (+ (* (/ 15 .10) (- 5.00 price))
    120))
我也犯了同样的错误。这是我的本地系统特有的吗?我很好奇——事实上,我可以简单地用某种形式的舍入来纠正这个问题;但我宁愿知道为什么它会先发生


除此之外,我建议对Lisp感兴趣的人看看HTDP。这似乎是一个相当温和的文本从它的略读,非常动手。我确实喜欢SICP——但这更像是一件长期的事情;我似乎花了好几天时间阅读,然后做练习,然后在网上补上讲座。HTDP似乎更像是‘哦,我有15分钟的空闲时间——我来看看HTDP’。

浮点数并不总是按照您期望的准确值存储。见例

如果您想要精确计算,您可以在您的示例中使用整数算术,将值存储为美分而不是美元

(define (attendees ticket-price-cents)
  (+ 12000 (* (/ (- 500 ticket-price-cents) 10) 1500)))
除了前面的(正确的)答案:你真正应该问的问题是:“为什么在其他语言级别上不发生这种情况?”答案是:许多其他语言级别将5.03解释为一个精确的数字(百分之五和百分之三百),而不是浮点数


JFYI

我想这将是一个浮点问题!我只是好奇为什么我使用了与本书完全相同的实现,结果却不同。我从来没有想到浮点问题在lisp方言这样的“高级”语言中如此明显;我以为这是一种普遍的行为!为了澄清这一点,只需一点:行为的差异并不是不确定的:正如我在回答中所指出的,它源于程序“读取”方式的差异。更清楚的是:在Racket中,如果您键入
0.25
,它将准确读取是否已为其配置了基础语言级别。HTDP中使用的初学者语言级别与其他学生语言级别一样,旨在实现这一目标。否则,在专业水平的Racket(
#lang Racket
)中,您可以更明确地写出精确的小数:
#e0.25
(define (attendees ticket-price-cents)
  (+ 12000 (* (/ (- 500 ticket-price-cents) 10) 1500)))