我正在将程序从 Scilab 代码转换为 C++。特别是一个循环产生的结果与原始 Scilab 代码略有不同(这是一段很长的代码,所以我不打算将它包含在问题中,但我会尽力在下面总结问题)。
问题是,循环的每一步都使用上一步的计算。此外,计算之间的差异仅在第 100,000 次迭代(大约 300,000 次)时变得明显。
注意:我正在使用“format(25);”将我的 C++ 程序的输出与 Scilab 5.5.2 的输出进行比较命令。这意味着我正在比较 25 位有效数字。我还想指出,我理解在一定数量的位之后如何不能保证精度,但在评论之前阅读下面的部分。到目前为止,两种语言之间的所有计算在 25 位以内都是相同的。
为了深入了解这个问题,到目前为止我已经尝试过:
我已经设法确认 Scilab 正在使用 IEEE 754 double (根据语言文档)。此外,根据维基百科,C++ 不需要将 IEEE 754 用于 double ,但据我所知,我在 C++ 中使用 double 的任何地方都与 Scilab 的结果完全匹配。
我还从 What Every Computer Scientist Should Know About Floating-Point Arithmetic 了解到 IEEE 不要求先验函数精确舍入。考虑到这一点,我比较了这些函数(sin()、cos()、exp())在两种语言中的结果,结果再次显示相同(最多 25 位数字)。
对于sqrt()和pow()的使用,我重复了上面的步骤。以及 Pi 的值(我在 C++ 中使用 M_PI,在 Scilab 中使用 %pi)。同样,结果是一样的。
注意:有趣的是,我注意到对于上述所有计算,两种语言之间的结果比实际计算结果(浮点运算除外)的匹配程度更高。例如:
使用 Wolfram Alpha 的 sin(x) 值 = 0.123456789.....
使用 Scilab 和 C++ 的 sin(x) 值 = 0.12345yyyyy.....
即使使用 Scilab 或 C++ 计算的值开始与实际结果(来自 Wolfram)不同。每种语言的结果仍然相互匹配。这让我相信大多数值都是以相同的方式计算的(在两种语言之间)。尽管 IEEE 754 不要求它们。
我最初的想法是上述前三点之一在两种语言之间的实现方式不同。但据我所知,一切似乎都产生了相同的结果。
是否有可能即使这些循环的所有输入都相同,但结果可能不同?可能是因为随着时间的推移累积了一个非常小的错误(超过我能看到的 25 位数字)?如果是这样,我该如何着手解决这个问题?
最佳答案
不,编号系统的格式不能保证不同语言的函数得到相同的答案。
函数,例如sin(x),可以使用相同的语言(以及不同的语言)以不同的方式实现。 sin(x) 函数就是一个很好的例子。许多实现将使用查找表或带插值的查找表。这具有速度优势。但是,某些实现可能会使用泰勒级数来评估函数。一些实现可能会使用多项式来得出一个近似值。
具有相同的数字格式是不同语言之间需要解决的一个障碍。功能实现是另一个。
请记住,您还需要考虑平台。使用 80 位浮点处理器的程序将与使用 64 位浮点软件实现的程序产生不同的结果。
关于c++ - 如果两种语言都遵循 IEEE 754,那么两种语言的计算结果是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37928129/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/