double Ceil(double x)
{
if(x!=x || // если x = NaN(SNaN) т.е. переполнение или ошибка
x> (long)1<<53 || // или число x положительное и превышает максимальную возможную мантиссу, т.е. дробная часть в x точно отсутствует
x<-(long)1<<53) // или число x отрицательное и превышает максимальную возможную мантиссу, т.е. дробная часть в x точно отсутствует return(x);
if(x-(long)x>0) // Если число положительное или дробная часть не равна нулюreturn(long)x+1.0; // добавляем к бездробной части 1elseif(x>-1 && x<0) // Если -1 < x < 0return -0.0; // то возвращаем -0.0elsereturn (double)long(x);
}
2018.08.2718:42:37.616 TestCeil (EURUSD,M1) Время выполнения функции CeilI = 1.321 наносекунд, Контрольная сумма = 5250492895.02018.08.2718:42:37.619 TestCeil (EURUSD,M1) Время выполнения функции CeilN = 1.094 наносекунд, Контрольная сумма = 5250492895.02018.08.2718:42:37.623 TestCeil (EURUSD,M1) Время выполнения функции ceil = 2.962 наносекунд, Контрольная сумма = 5250492895.02018.08.2718:42:37.623 TestCeil (EURUSD,M1) Идет бесконечный поиск расхождения по случайным числам double ... Прервите скрипт, когда надоест ждать
当输入的x有一个分数部分时,结果是罕见的。
2018.08.2718:49:45.734 TestCeil (EURUSD,M1) Время выполнения функции CeilI = 0.307 наносекунд, Контрольная сумма = 1.15583114403606 e+232018.08.2718:49:45.736 TestCeil (EURUSD,M1) Время выполнения функции CeilN = 0.102 наносекунд, Контрольная сумма = 1.15583114403606 e+232018.08.2718:49:45.738 TestCeil (EURUSD,M1) Время выполнения функции ceil = 1.026 наносекунд, Контрольная сумма = 1.15583114403606 e+232018.08.2718:49:45.738 TestCeil (EURUSD,M1) Идет бесконечный поиск расхождения по случайным числам double ... Прервите скрипт, когда надоест ждать
哇--太酷了!谢谢。我想--每次都算数。是的,这很合乎逻辑,你已经可以在编译时计算出来了。
所以,像这样。
但写成DBL_MANT_DIG 而不是53会更正确。
如果双数的所有值都是小数,则收益最小的情况。
1.你的实现是不完整的,只有在事先知道可能的值的范围时才能使用。
以下是完整实现的代码
2.当优化功能被禁用时,为调试而编译的自写函数明显比内置函数慢。
1.你的实现是不完整的,只有在事先知道可能的值的范围时才能使用。
以下是完整实现的代码
2.当优化功能被禁用时,自写函数在编译调试时要比内置函数慢得多。
非常感谢你,伊利亚斯,感谢你的优秀代码。
当然,它在这里是一个很好的帮手。
我正在研究它。
ZS这个 版本不是完全一样吗?尼古拉,你好。我看到你在做图形工作,但我不完全了解实际的任务是什么。你在做什么工作?
加快渲染功能的速度?
总的来说,关于这个主题,我已经成功实现了在画布上绘画的完全替代方法。不使用CCanvas类。
也就是说,不是修改一套单独的功能,而是创建一个完整的绘图机制,由一个单一的块组成。
(当然,我很难在代码中证明这一切,因为有很多代码,而且是以非标准的方式写的,但我想告诉你的是,一般情况下)。
所以。
1.区块(功能)。
只接受2个参数 - Kanvas和Element。
2.每个MT-对象都有自己的资源分配给它。它被立即使用ResourceReadImage()加载到 "像素数组 "中;如果资源还不存在,就会设置一个标志,这将随后确定周期在内核上的范围。
3.内核,是一个所有元素的属性数组。它包含物体的尺寸数据,以及不同状态的颜色。还有很多其他的数据。每个对象总共有235个属性。同时,每个元素(取决于类型)可以包含1到11个对象(没有限制)。
4.在绘图块中,每个对象都意味着绘图的一个 "细节"。因此,在内核中按对象进行的循环,是一个绘制循环,在这个循环中,每个Detail的图像被创建。如果一个画布尚未创建,则仅对该画布的所有细节进行一个完整的循环。在内核中对每个细节规定了对Kanvas的归属。也就是说,所有的Kanvases,(和零件)都有自己的序列号。通过这些数字,有可能只画出所需的Kanvas的内容。
4.如果一个Kanvas已经存在,并且它的图像是以像素数组的形式加载的,而我们只需要重绘一个元素(例如在一个颜色变化事件中),那么核心循环的范围就会缩小到单一元素的边界,而这个元素的编号是由绘图函数获得的。
这幅画本身很简单。它是在一维数组的单元格中从左到右的一个循环。在周期设定之前。
1.起始单元(A点)。
2.终端细胞(B点)。
3.走过去。
很难用一句话概括1500行代码块的操作。这是一个功能,已经成长和打磨了20个月。我几乎对它了如指掌,这使我很容易继续发展它。
通过使用内核和焦点(将重要的变量放在全局范围内),该块获得了巨大的可能性。他们的极限至今我还看不出来。
因此,这就是标准的坎布画法的替代方案。
zy。如果对细节感兴趣,我可以解释。
这是块的开头的样子:
1.你的实现是不完整的,只有在事先知道可能的值的范围时才能使用。
以下是完整实现的代码
再次感谢您提供的代码。我一直在思索这些位面的问题,就像双重的。事实证明,这并不像我之前想象的那么容易。
我根据你的版本 稍作调整。只有一个区别:你的版本在值-1>x>0时返回Ceil(-0.1)= - 0.0,而我的版本返回0.0。虽然我不知道它什么时候可能会有用。
而你得到的是以下结果。
同样的事情,只是可读性和评论。
我写了一个脚本(附后),它证实了与你的版本100%一致。
但这个变体更快、更紧凑,而且在我看来,更具有可读性。
请注意,在函数主体中甚至没有创建一个变量,而你的版本创建了4个8字节的变量。
也许我错了?
当输入的x总是有一个小数部分时的结果。
当输入的x有一个分数部分时,结果是罕见的。
2.当优化功能被禁用时,自写的函数在编译调试时明显比内置函数慢。
目前还不清楚为什么在调试时需要这种速度。
但如果你真的需要它,你可以使用该结构。
还有一件事我不明白。
为什么文件和实际的DBL_MANT_DIG= 53?
因为根据同一维基百科=52。
而且,就像,从你的代码 中可以看出,52也?
尼古拉,你好。我看到你在做图形工作,但我不完全了解实际的任务是什么。你在做什么工作?
加快渲染功能的速度?
你好,Piotr!
我将当面答复。
还有一件事我不明白。
为什么文件和实际的DBL_MANT_DIG= 53?
而根据同一维基百科=52。
而你的代码 似乎也暗示着它是52?
你有没有试着自己去寻找问题的答案?
提示:在谷歌搜索中,输入 "DBL_MANT_DIG 53 52"。