#include <iostream>
#include <cmath>
#include <sstream>
using namespace std;
int main(){
stringstream ss;
double ad = 7.63918e-313;
ss << ad;
cout<<ss.str()<<endl;
//you will see that the above double is valid, and maps to the specified string
//but stod cannot map it back
stod("7.63918e-313");
//terminate called after throwing an instance of 'std::out_of_range'
}
在这里运行:https://onlinegdb.com/Sy1MT1iQM
“7.63918e-313”将由序列化一个 double 值产生,但 stod 不能反序列化它。这里发生了什么?最小的双倍数应该是 10^−324 左右。
stdlib 中是否有一对函数可以可靠地从字符串化来回映射 double ?不应该有吗?
情节变厚了。我们有两个奇怪的观察结果。
std::numeric_limits<double>::min() stod 也无法解析。
std::numeric_limits<double>::min()不是最小加倍。我们的双更小,我发现我们可以通过简单地除以最小值来得到更小的 double ,所以这并不是说我的 double 有异常或其他什么https://onlinegdb.com/rJvilljQz
我很担心。
最佳答案
C++ 标准允许将字符串转换为 double如果结果在低于正常范围内,即使它是可表示的,也报告下溢。
7.63918•10-313在double范围内, 但在正常范围内。 C++ 标准说 stod电话 strtod然后按照 C 标准来定义 strtod . C标准表示strtod可能下溢,关于它说“如果数学结果的量级太小以至于无法在指定类型的对象中表示数学结果,没有异常舍入误差,结果就会下溢。”这是一个笨拙的措辞,但它指的是遇到次正规值时发生的舍入误差。 (低于正常值的相对误差比正常值大,因此它们的舍入误差可以说是非常大的。)
因此,C++ 标准允许 C++ 实现对次正规值进行下溢,即使它们是可表示的。
关于您的观察 std::numeric_limits<double>::min() “也无法解析”(我猜你的意思是它也报告下溢),这可能是因为你转换了 std::numeric_limits<double>::min()到包含十进制数字的字符串,并且该十进制数字不是 std::numeric_limits<double>::min() 的精确表示.如果向下舍入,则略小于 min()。 ,因此它也在低于正常范围内。因此,试图将该十进制数字转换回 double可能会正确报告它低于正常范围。
关于您的观察 std::numeric_limits<double>::min()不是最小值double , 那是对的。 std::numeric_limits<double>::min()由 C++ 标准指定为最小正正常值。它下面可能有低于正常值。
对于 IEEE-754 64 位二进制 float ,正常范围是从 2-1022 到 21024-2971 .在这个范围内,每个数字都用一个符号(浮点表示的小数部分)表示,它有一个前导 1 位,后面跟着 52 个额外的位,所以当这个范围内的任何实数四舍五入到最近的可表示值最多是前导位位置值的 2-53 倍。
除了这个正常范围之外,还有一个从 2-1074 到 2-1022-2-1074 的低于正常范围。在这个区间内,浮点格式的指数部分已经达到最小值,不能再减少了。为了表示此区间中越来越小的数字,有效数减少到正常最小值 1 以下。它以 0 开头,后面跟着 52 个附加位。在此区间内,将实数舍入到最接近的可表示值时发生的误差可能大于前导位位置值的 2-53 倍。由于指数不能进一步减少,因此该区间中的数字随着变得越来越小而增加前导 0 位的数量。因此,使用这些数字所涉及的相对错误会增加。
无论出于何种原因,C++ 都表示实现可能会在此时间间隔内报告下溢。 (IEEE-754 标准以复杂的方式定义了下溢,也允许实现一些选择。)
关于c++ - std::stod 为应该有效的字符串抛出 out_of_range 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48086830/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解