Jon*_*eet 16
科学价值往往是"自然"价值(长度,质量,时间等),从那里开始有一个自然的不精确程度 - 但你可能想要非常,非常大或非常非常小的数字.对于这些值,double通常是一个好主意.它很快(几乎到处都有硬件支持),可以向上和向下扩展到巨大/微小的值,如果你不关心精确decimal值,通常可以正常工作.
decimal对于"人工"数字来说是一个很好的类型,其中有一个确切的值,几乎总是自然地表示为十进制 - 这是典型的货币例子.但是,它的double存储成本是存储的两倍(每个值8个字节而不是4个),具有较小的范围(由于指数范围更加有限),并且由于缺乏硬件支持而显着变慢.
我个人只会使用float存储是一个问题 - 当你只有大约7个有效小数位时,很快就会产生不准确性.
最终,正如"熊会吃你"的评论所暗示的那样,这取决于你所谈论的价值 - 当然还有你打算用它们做什么.没有任何进一步的信息,我怀疑这double是一个很好的起点 - 但你应该根据个人情况做出决定.
当然,"科学计算"一词有点模糊,但总的来说,它是double.
float主要是为了与期望32位浮点数的库兼容.性能float和double操作(如添加)完全相同,因此新代码应始终使用,double因为它具有更高的精度.
但是,x86 JITter永远不会内联或返回a的函数float,因此使用floatin方法实际上可能会更慢.再次,这是为了兼容性:如果它是内联的,执行引擎将跳过降低其精度的转换步骤,因此如果要内联这些函数,JITter可能无意中改变某些计算的结果.
最后,还有decimal.只要有一定数量的小数位,重要的是使用它.陈规定型的用例是货币操作,但当然它支持超过2个小数位 - 它实际上是80位数据.
如果即使64位的精度double还不够,可以考虑使用外部库来获得任意精度的数字,但当然,如果您的特定科学用例特别要求它,您将只需要它.