Standart özelliklerin/yaklaşımların alternatif uygulamaları - sayfa 10

 
pavlick_ :
)). Bu, yalnızca değerler aralığı hakkında kesin bilgi sahibi olan kişisel el sanatlarında bir yer olabilir, ancak standart bir kütüphanede olamaz. Yerleşik işlevler aptallar tarafından yazılmaz, en akıllı olduğunu düşünmeyin. Burada da bir arkadaş tanımsız ve belirtilmemiş davranış hakkında yazıyor ve sonra yanlış çalışmasına şaşırıyor https://www.linux.org.ru/forum/development/14422428#comments . Ve gerçek bir algoritmada (ve çıplak döngüde değil) birkaç nanosaniyelik tüm bu tasarruflar görünür bile olmayacak.

Şimdi söylediklerinizi yakaladınız.
Konuya dahil olmadığınız sözlerimi geri alıyorum. Affınıza sığınırım.
Evet, bu seçenek, çift sayının -9007199254740992 ile 9007199254740992 (2 üzeri 53'ün gücü (mantisteki bit sayısı)) aralığında olduğu uyarısıyla kullanılabilir.

 
Renat Fatkhullin :
Bir tamsayının dışında ne elde ettiğinizi düşünün.

ya bu bir seçenekse?

 double Ceil ( double x) { return double ((x> 9007199254740992 || x<- 9007199254740992 )?x:(x-( long )x> 0 )?( long )x+ 1 :( long )x);}
double Round( double x) { return double ((x> 9007199254740992 || x<- 9007199254740992 )?x:(x> 0 )?( long )(x+ 0.5 ):( long )(x- 0.5 ));}
double Floor( double x) { return double ((x> 9007199254740992 || x<- 9007199254740992 )?x:(x> 0 )?( long )x:(( long )x-x> 0 )?( long )x- 1 :( long )x);}

sonuç:

 2018.08 . 26 10 : 49 : 23.552 TestRound (Crypto.ALT,M10)      Время цикла без округления = 1.317 наносекунд, сумма = 115583114403605978808320.00000000
2018.08 . 26 10 : 49 : 23.556 TestRound (Crypto.ALT,M10)      Время выполнения функции ceil =   2.129 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 10 : 49 : 23.557 TestRound (Crypto.ALT,M10)      Время выполнения функции Ceil =   0.100 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 10 : 49 : 23.560 TestRound (Crypto.ALT,M10)      Время выполнения функции floor = 1.299 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 10 : 49 : 23.561 TestRound (Crypto.ALT,M10)      Время выполнения функции Floor = 0.120 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 10 : 49 : 23.564 TestRound (Crypto.ALT,M10)      Время выполнения функции round = 1.787 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 10 : 49 : 23.566 TestRound (Crypto.ALT,M10)      Время выполнения функции Round = 0.106 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 10 : 49 : 23.566 TestRound (Crypto.ALT,M10)      Идет бесконечный поиск расхождения по случайным числам double ... Прервите скрипт, когда надоест ждать

Testin tam kimliği gösterdiği gibi.

Doğru, aralığın kontrol edildiği bu sürümdeki alternatif çözümün hızı yalnızca yaklaşık 2 kat daha yüksektir (3-8 değil), ancak bu, çift sayının -9007199254740992 ile 9007199254740992 aralığında olması durumunda geçerlidir. bu aralığın dışında olduğunda çok daha yüksektir.

Dosyalar:
TestRound.mq5  9 kb
 
Nikolai Semko :


Testin tam kimliği gösterdiği gibi.

Doğru, bu seçenek nan, snan değerlerini aldığında çift giriş değişkeninin taşmalarını hesaba katmaz.

Bunun dikkate alınması gerekiyorsa, yine de bir çek ekleyebilirsiniz, ancak yine de bu seçenek orijinal işlevden daha hızlı çalışacaktır.

 double Ceil ( double x) { return double ((! MathIsValidNumber (x) || x> 9007199254740992 || x<- 9007199254740992 )?x:(x-( long )x> 0 )?( long )x+ 1 :( long )x);}
double Round( double x) { return double ((! MathIsValidNumber (x) || x> 9007199254740992 || x<- 9007199254740992 )?x:(x> 0 )?( long )(x+ 0.5 ):( long )(x- 0.5 ));}
double Floor( double x) { return double ((! MathIsValidNumber (x) || x> 9007199254740992 || x<- 9007199254740992 )?x:(x> 0 )?( long )x:(( long )x-x> 0 )?( long )x- 1 :( long )x);}
 
Nikolai Semko :

Test edici/iyileştirici için bir Uzman Danışman indirin. Pratikte hızın önemli olduğu yer burasıdır.

 
fxsaber :

Test edici/iyileştirici için bir Uzman Danışman indirin. Pratikte hızın önemli olduğu yer burasıdır.

Birçok kişinin bildiği gibi, ben de kenar yumuşatılmış grafiklerle uğraşırım. Yuvarlama işlevlerinin aktif olarak kullanıldığı, pürüzsüz grafikler ve her pikselle çalışmak içindir.

Daha önce, yuvarlama işlevinin bir çiftin karekökünü almaktan daha yavaş olduğunu hayal bile edemezdim.
Bu nanosaniyeleri solumaya başlamamın nedeni budur. Çünkü düzleştirilmiş bir grafik üzerindeki bu nanosaniyeler her karede milisaniyeye dönüşebilir ve her 33 milisaniyede bir kare değişebilir.

 
Nikolai Semko :

Birçok kişinin bildiği gibi, ben de kenar yumuşatılmış grafiklerle uğraşırım. Yuvarlama işlevlerinin aktif olarak kullanıldığı, pürüzsüz grafikler ve her pikselle çalışmak içindir.
Bu nanosaniyeleri solumaya başlamamın nedeni budur. Çünkü düzleştirilmiş bir grafik üzerindeki bu nanosaniyeler her karede milisaniyeye dönüşebilir ve her 33 milisaniyede bir kare değişebilir.

Tabii ki, bu grafikler için önemlidir. Bu nedenle, çok uzun bir süredir neredeyse tüm yaygın görevler için algoritmik optimizasyonlar var.

 
fxsaber :

Tabii ki, bu grafikler için önemlidir. Bu nedenle, çok uzun bir süredir neredeyse tüm yaygın görevler için algoritmik optimizasyonlar var.

Hatalısınız. Henüz sürülmüş bir tarla yok ve sürülmüş olan kapalı. Ve daha da fazlası MQL ile. CCanvas sınıfı optimallikten çok uzaktır ve orada pürüzsüzlük pratikte yoktur ve pürüzsüzlükten gelen şey tatmin edici değildir.

 

Neden LONG_MAX/MIN kullanmıyorsunuz? Bir şekilde daha iyi görünecek. Hiçbir şeye benzemiyor. Testlerinizi gcc üzerinde çalıştırdım (minik bir değişiklikle, elbette derleyici çok eski 5.4.0'dır ki bu da elinizin altındaydı):

1. -O3 ile Derleme

Время цикла без округления = 0.001099185 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции ceil =   0.004310106 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции Ceil =   0.001912712 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции floor =   0.005283493 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции Floor =   0.002031304 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции round =   0.005308409 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции Round =   0.002344382 секунд, сумма = 1.15583114 e+ 23

2. -Ofast ile Derleme

Время цикла без округления = 0.000552652 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции ceil =   0.001720999 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции Ceil =   0.00189282 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции floor =   0.001430063 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции Floor =   0.001979336 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции round =   0.001698521 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции Round =   0.001944874 секунд, сумма = 1.15583114 e+ 23

Kodunuzda, zaman hesaplaması önemsizdir - çıktı milisaniye cinsindendir (nano değil) ve hala eksi t0'ın neden gerekli olduğunu anlamıyorum.

 Print ("Время выполнения функции ceil =  "+ DoubleToString (( double )( GetMicrosecondCount ()-t-t0)/ 1000 , 3 )+" наносекунд, Контрольная сумма = "+ string (s));
 
Nikolai Semko :

Hatalısınız. Henüz sürülmüş bir tarla yok ve sürülmüş olan kapalı.

Dünya deneyiminden bahsetti. Grafiğin bulunduğu tematik forumlardaki algoritmalara bakın. demolar yapar. İnsanlar hızlı algoritmalar paylaşır.

 
fxsaber :

Dünya deneyiminden bahsetti. Grafiğin bulunduğu tematik forumlardaki algoritmalara bakın. demolar yapar. İnsanlar hızlı algoritmalar paylaşır.

linki bırak lütfen
Neden: