草庐IT

c++ - 在 C++ 中转换大整数 <-> double

coder 2024-02-23 原文

为了好玩,我正在用 C++ 编写自己的长算术库,它已经完成了,我什至用那个库实现了几个 Cryptogrphic 算法,但仍然缺少一件重要的事情:我想转换 double (和 float /长 double )到我的号码,反之亦然。我的数字表示为一个可变大小的无符号长整型数组加上一个符号位。

我试图用谷歌找到答案,但问题是人们很少自己实现这些东西,所以我只找到关于如何使用 Java BigInteger 等的东西。

从概念上讲,这相当简单:我取尾数,将其移动指数指定的位数并设置符号。在另一个方向上,我截断它以使其适合尾数并根据我的 log2 函数设置指数。

但我很难弄清楚细节,我可以尝试一些位模式并将其转换为 double ,但我没有找到实现该目标的优雅方法,或者我可以“计算”它从 2 开始,求幂,乘法等,但这似乎不是很有效。

我希望有一个不使用任何库调用的解决方案,因为我试图避免为我的项目使用库,否则我可以只使用 gmp,此外,我经常在其他几个场合有两个解决方案,一个使用内联一种高效且更独立于平台的汇编程序,因此任何一个答案对我都有用。

编辑:我将 uint64_t 用于我的部分,但我希望能够根据机器更改它,但我愿意使用一些 #ifdef 来实现一些不同的实现。

最佳答案

我将在这里做出不可移植的假设:即 unsigned long longdouble 更准确. (在我所知道的所有现代桌面系统上都是如此。)

首先,将最高有效整数转换为 unsigned long long .然后将其转换为双 S .让M是比第一步中使用的整数少的整数个数。相乘 S通过 (1ull << (sizeof(unsigned)*CHAR_BIT*M) . (如果移动超过 63 位,则必须将它们拆分为单独的移位并进行一些算术运算)最后,如果原始数字为负数,则将此结果乘以 -1。

这四舍五入了很多,但即使进行了这种四舍五入,由于上述假设,没有数字丢失,无论如何转换为 double 都不会丢失。我认为这与 Mark Ransom 所说的过程类似,但我不确定。

要将 double 转换为双整数,首先将尾数分隔成 double M和指数到 int E , 使用 frexp .相乘M通过 UNSIGNED_MAX ,并将结果存储在 unsigned R 中.如果std::numeric_limits<double>::radix()是2(我不知道它是否适用于x86/x64),你可以很容易地转移R离开 E-(sizeof(unsigned)*CHAR_BIT)位,你就完成了。否则结果将是 R*(E**(sizeof(unsigned)*CHAR_BIT)) (其中 ** 表示的幂)

如果性能是一个问题,您可以为您的 bignum 类添加一个重载以乘以 std::constant_integer<unsigned, 10> ,它只返回 (LHS<<4)+(LHS<<2) .如果您愿意,您可以类似地优化其他常量。

关于c++ - 在 C++ 中转换大整数 <-> double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12323668/

有关c++ - 在 C++ 中转换大整数 <-> double的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如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以想要的样式转储标量?解

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  5. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  6. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将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.你能做的最好的事情是:

  7. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  8. ruby - 在 Ruby 中将整数格式化为固定长度的字符串 - 2

    有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的

  9. ruby-on-rails - 没有参数的 `<<`(小于两倍)是什么意思? - 2

    我在一个我想在formtasticGem中覆盖的方法中找到了这个。该方法如下所示:defto_htmlinput_wrappingdohidden_field_html是什么意思?在第三行做什么?我知道它对数组有什么作用,但在这里我不知道。 最佳答案 你可以这样读:hidden_field_htmllabel_with_nested_checkbox是连接到hidden_​​field_html末尾的参数-为了“清晰”,他们将其分成两行 关于ruby-on-rails-没有参数的`

  10. ruby-on-rails - 找不到 gem railties (>= 0.a) (Gem::GemNotFoundException) - 2

    我已经看到了一些其他的问题,尝试了他们的建议,但没有一个对我有用。我已经使用Rails大约一年了,刚刚开始一个新的Rails项目,突然遇到了问题。我卸载并尝试重新安装所有Ruby和Rails。Ruby很好,但Rails不行。当我输入railss时,我得到了can'tfindgemrailties。我当前的Ruby版本是ruby2.2.2p95(2015-04-13修订版50295)[x86_64-darwin15],尽管我一直在尝试通过rbenv设置ruby​​2.3.0。如果我尝试rails-v查看我正在运行的版本,我会得到同样的错误。我使用的是MacOSXElCapitan版本10

随机推荐