Tag: 精度

调整小数精度.net

这些行在C# decimal a = 2m; decimal b = 2.0m; decimal c = 2.00000000m; decimal d = 2.000000000000000000000000000m; Console.WriteLine(a); Console.WriteLine(b); Console.WriteLine(c); Console.WriteLine(d); 生成这个输出: 2 2.0 2.00000000 2.000000000000000000000000000 所以我可以看到,从文字创build一个十进制variables允许我来控制精度。 我可以在不使用文字的情况下调整小数variables的精度吗? 我如何从一个创buildb? 我怎样才能从c创buildb?

如何在Linux中创build高分辨率定时器来衡量程序性能?

我试图比较GPU的CPU性能。 对于NVIDIA GPU,我一直使用cudaEvent_ttypes来获得非常精确的时间。 对于我一直在使用以下代码的CPU: // Timers clock_t start, stop; float elapsedTime = 0; // Capture the start time start = clock(); // Do something here ……. // Capture the stop time stop = clock(); // Retrieve time elapsed in milliseconds elapsedTime = (float)(stop – start) / (float)CLOCKS_PER_SEC * 1000.0f; 显然,那段代码只是代码,如果你在秒钟计数。 而且,结果有时会显得很奇怪。 有谁知道在Linux中创build高分辨率定时器的方法吗?

检查浮点值是否等于0是否安全?

我知道你不能依赖于正常的双或十进制types值之间的平等,但我想知道如果0是一个特例。 虽然我可以理解0.00000000000001和0.00000000000002之间的不精确性,0本身似乎很难搞乱,因为它只是一无所获。 如果你什么都不准确,那不是什么了。 但是我不太了解这个话题,所以我不能说。 double x = 0.0; return (x == 0.0) ? true : false; 这将永远回报真实?

T-SQL十进制除法精度

有谁知道为什么,使用SQLServer 2005 SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999) 给我11.74438969709659, 但是当我把分母的小数位数增加到15时,我得到的答案不太准确: SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999) 给我11.74438969

C#DateTime.Now精度

我只是在做一些unit testing的时候遇到了一些与DateTime.UtcNow出乎意料的行为。 看起来,当你连续快速地调用DateTime.Now/UtcNow时,似乎给你的时间间隔长于同一个值,而不是捕获更精确的毫秒增量。 我知道有一个秒表类,可能更适合做精确的时间测量,但我很好奇,如果有人可以在DateTime中解释这种行为? 是否有DateTime.Nowlogging的官方精确度(例如,精确到50毫秒以内?)? 为什么DateTime.Now会比大多数CPU时钟所能处理的更精确? 也许它只是为最低公分母CPUdevise的? public static void Main(string[] args) { var stopwatch = new Stopwatch(); stopwatch.Start(); for (int i=0; i<1000; i++) { var now = DateTime.Now; Console.WriteLine(string.Format( "Ticks: {0}\tMilliseconds: {1}", now.Ticks, now.Millisecond)); } stopwatch.Stop(); Console.WriteLine("Stopwatch.ElapsedMilliseconds: {0}", stopwatch.ElapsedMilliseconds); Console.ReadLine(); }

控制R中打印输出的小数位数

R中有一个选项来控制数字显示。 例如: options(digits=10) 应该给出计算结果10位直到R会话结束。 在R的帮助文件中,数字参数的定义如下: 位数:控制打印数字值时要打印的位数。 这只是一个build议。 有效值为1 … 22 ,默认为7 所以说这只是一个build议。 如果我喜欢总是显示10位数字,不多或less? 我的第二个问题是,如果我想显示超过22位数字,即更精确的计算(如100位数),该怎么办? 基地R是可能的,还是我需要一个额外的软件包/function呢? 编辑:感谢jmoy的build议,我试过sprintf("%.100f",pi) ,它给了 [1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000" 其中有48位小数。 这是R可以处理的最大限制吗? 实际上pi有无限的小数。

在C#中浮点math是否一致? 是真的吗?

不,这不是另一个“为什么是(1 / 3.0)* 3!= 1”的问题。 最近我一直在读浮点数; 具体来说, 相同的计算如何在不同的体系结构或优化设置上给出不同的结果 。 对于存储重播的video游戏来说,这是一个问题,或者是对等networking (而不是服务器 – 客户端),这依赖于所有客户端在每次运行程序时产生完全相同的结果 – 一个小的差异浮点计算可能会导致不同机器上的游戏状态(甚至是在同一台机器上 ) 即使在“遵循” IEEE-754的处理器之间也会发生这种情况,主要是因为某些处理器(即x86)使用了双精度扩展 。 也就是说,他们使用80位寄存器来执行所有计算,然后截断为64位或32位,从而导致与使用64位或32位进行计算的机器不同的舍​​入结果。 我已经看到了这个问题的几个解决scheme在线,但所有的C + +,而不是C#: 使用_controlfp_s (Windows), _FPU_SETCW (Linux?)或fpsetprec (BSD)禁用双扩展精度模式(以便所有double计算使用IEEE-754 64位)。 总是使用相同的优化设置来运行相同的编译器,并要求所有用户具有相同的CPU架构(无跨平台播放)。 因为我的“编译器”实际上是JIT, 每次程序运行时可能会有不同的优化 ,所以我认为这是不可能的。 使用定点算术,并避免float和double 。 decimal可以用于这个目的,但会慢很多,并且没有一个System.Math库函数支持它。 那么, 这在C#中甚至是一个问题? 如果我只打算支持Windows(而不是Mono)呢? 如果是这样, 有没有办法强制我的程序以正常的双精度运行? 如果没有, 是否有任何库可以帮助保持浮点计算的一致性?

在16,32和64位IEEE-754系统中可以表示的范围是什么?

我知道一些关于如何表示浮点数的知识,但恐怕还不够。 一般的问题是: 对于一个给定的精度(对于我来说,基数为10的精确小数位数),对于16,32和64位IEEE-754系统,可以表示什么范围的数字? 具体来说,我只对16位和32位数的范围精确到+/- 0.5(1位)或+/- 0.0005(千位)感兴趣。

为什么我会看到一个双variables初始化为21.4,如21.399999618530273?

double r = 11.631; double theta = 21.4; 在debugging器中,这些显示为11.631000000000000和21.399999618530273 。 我怎样才能避免这一点?

十进制与双精度! – 我应该使用哪一个?

我不断看到人们在C#中使用双打。 我知道我读了一些双打有时会失去精度的地方。 我的问题是什么时候应该使用一个double,什么时候应该使用一个十进制types? 哪种types适合金钱计算? (即超过1亿美元)