假设我有两个变量 a和 b , 要么都是 float 类型, 或两者都输入 double ,其中包含一些值。以下断言总是成立吗?我的意思是,数值错误的存在会改变结论吗?
a > b is true if and only if a <= b is false
a < b is true if and only if a >= b is false
a >= b is necessarily true if a == b is true
a <= b is necessarily true if a == b is true
对于第三个和第四个,我的意思是,例如,“a == b is true”总是给你“a >= b is true”吗?
编辑:
假设a或 b是 NaN 或 Inf.
编辑 2:
在阅读 1985 年的 IEEE 754 标准后,我发现了以下内容。
首先,它说了以下内容
Comparisons are exact and never overflow nor underflow.
我的理解是在做比较的时候,没有考虑数值误差,数字是按原样比较的。自加减法如a - b需要额外的努力来定义数字错误是什么,我假设上面的引述是说像 a > b 这样的比较不是通过判断是否a - b > 0来完成是真的还是假的。如果我错了,请告诉我。
其次,列出了四种互斥的规范关系。
Four mutually exclusive relations are possible: less than, equal, greater than, and unordered. The last case arises when at least one operand is NaN. Every NaN shall compare unordered with everything, including itself.
然后在表4中,定义了这四种规范关系下根据真值表示的各种运算符,如“>”或“>=”。从表中我们立即得到以下信息:
a >= b is true if and only if a < b is false
a <= b is true if and only if a > b is false
Both a >= b and a <= b are necessarily true if a == b is true
所以我的问题中的断言可以得出结论是正确的。但是,我无法在标准中找到任何定义对称性是否正确的内容。换句话说,来自 a > b我不知道b < a是真的还是假的。因此我也无法推导出a <= b is true来自 b < a is false .所以我有兴趣知道,除了 OP 中的断言之外,以下内容是否始终为真
a < b is true if and only if b > a is true
a <= b is true if and only if b >= a is true
etc.
编辑 3:
关于@Mark Ransom 提到的非正规数,我阅读了有关它的维基百科页面,我目前的理解是非正规数的存在不会改变上述结论。换句话说,如果某些硬件声称它完全支持非正规数,那么它也需要确保比较运算符的定义满足上述标准。
编辑 4:
我刚刚阅读了 IEEE 754 的 2008 年修订版,它也没有说明任何关于对称性的内容。所以我猜这是未定义的。
(以上所有讨论都假定任何操作数中都没有 NaN 或 Inf)。
最佳答案
如果两个数字都不是 NaN 或无穷大,那么如果您有一个 IEEE 兼容系统,您的断言就成立。如果标准没有提到它,那么我敢肯定那只是因为它足够明显而不值得一提。特别是,如果“a < b”和“b=""> a”不具有相同的值(即使对于 NaN 和无穷大),那么我们就在疯狂的城镇。
非规范化不应影响结论,因为如果您假设 IEEE 兼容,那么非规范化支持是给定的。
我能想到的唯一风险是在涉及 x87 FPU 的情况下,它是奇怪的 80 位长 double 格式。从 80 位 long double 舍入到 double 或 float 的代价很高,因此有时会被省略,这可能会导致像这样触发的断言:
assert(sqrt(val) == sqrt(val));
它可能会触发,因为第一个 sqrt() 调用的结果可能会写入内存,因此四舍五入为 float 或 double。然后将其与第二次 sqrt() 调用的结果进行比较,该结果可能不会四舍五入。但是,如果 sqrt() 返回 float 或 double,严格来说,在进行比较之前未能舍入第二个 sqrt() 调用的结果是不符合 IEEE 标准的。
只有当两个数都是无穷大时,无穷大才应该是个问题。
关于c++ - 关于 float 关系运算符否定的断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22236922/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia
问题是:除了在“OperatorExpressions”?例如:1%!2 最佳答案 是的,可以创建自定义运算符,但有一些注意事项。Ruby本身并不直接支持它,但是superatorsgem做了一个巧妙的把戏,将运算符链接在一起。这允许您创建自己的运算符,但有一些限制:$geminstallsuperators19然后:require'superators19'classArraysuperator"%~"do|operand|"#{self}percent-tilde#{operand}"endendputs[1]%~[2]#Out