MQL4 ustaları için soru. Yine Çift Karşılaştırma hakkında. - sayfa 8

 
SK. писал (а):
VBAG :
Valla ben senden bunu beklemiyordum

Sözlerimi geri alıyorum.
Şüphelerimde yanıldığıma sevindim.
 

SK'ya

Sen daha iyi bilirsin. MQL'yi bir programlama dili olarak görmüyorum. Sadece böyle bir lehçe.

Bu arada, içinde zadolbali İKİ şey var:

1) işlem numaralandırması yoktur, yani mutlaka kaşlı ayraçlar

2) dönüş - parantez ihtiyacı ile çok can sıkıcı

Ama genel olarak - aferin çocuklar.

Kernighan ve Ritchie onları alkışlardı.

 
VBAG писал (а):
Sözlerimi geri alıyorum.
Şüphelerimde yanıldığıma sevindim.


Ve kavga etmedik :)

Depfy :

MQL'yi bir programlama dili olarak görmüyorum. Sadece böyle bir lehçe.

Muhtemelen bir terminoloji meselesidir. Örneğin, MQL'de tam teşekküllü bir dilin tüm işaretlerini buluyorum. Öyle ya da böyle, ancak bu, tüccara faaliyetlerini mekanize etme ve otomatikleştirme fırsatı sağlayan birkaç dilden biridir (en iyisi, aklınızda bulunsun). Bu dil bana oldukça tatmin edici görünüyor, en azından yeteneklerinin çoğu algoritmanın ihtiyaçlarıyla tekrar tekrar örtüşmesi anlamında (başka bir deyişle, yeterli uygulanabilir fikir olacaktır, ancak uygulama araçları zaten mevcut).
 
SK. писал (а):
...

Ve mevcut durumda, 123.000000000000 değişkeninin hesaplamalarda kullanıldığı zamandaki başlangıç değeri 122.999999999999 olabilir. Ve bu, değişkenin keşfedilmesinden bu yana değerinin hiç değişmemesine, ancak program tarafından yalnızca diğer hesaplamalara katılması istenmesine rağmen.


Aslında, tüm yaygara bu yüzden. Bu nedenle NormalizeDouble () işlevini gerçek hesaplamaya mümkün olduğunca yakın, tercihen if, for, while ifadesinin koşulunda kullanmak gerekli hale geldi.

Sözlerine güveniyor musun? Mümkünse bilginizin kaynağını belirtiniz?

O zaman sana bir sorum var

1? sorun bir değişkeni depolamak veya okumaksa, döndürülen değer de hatırlanırsa veya bir hatayla okunursa NormalizeDouble() nasıl yardımcı olabilir?
2? neden NormalizeDouble(değer, basamak) şeması !OC! NormalizeDouble(değer, rakamlar) burada !OS! - karşılaştırma operatörü, her zaman çalışmıyor mu? doğrudan if içine yerleştirilmiş olsa bile?
3? NormalizeDouble() (fonksiyon algoritması) nasıl çalıştığını biliyor musunuz?
4? Bu konudaki fikrimi yazdım, siz ne düşünüyorsunuz?

yerçekimi001 yazdı:

...
Normalleşme hakkında zaten konuştum. Önce, neden kullanacağımızı ve ancak o zaman nasıl ve nerede kullanacağımızı söyleyin.

Anahtar soru bu, değil mi? Ben kendim bunu uzun süre düşündüm: "bir duble girersin ve bir duble alırsın " . Ne değişebilir?
Tam cevabı bulamadım. Ama ben böyle hayal ediyorum

çift a = 2.00000000000000
çift b = 2.0000000000001
çift c = 1.999999999999

Tüm bu değişkenler farklıdır ve son karaktere (sayı) kadar bellekte saklanırlar!
Bu durumda işaretleri (sayıları) kendimiz belirleriz. Tanımlanmayan her şey sıfırlarla doldurulur.

Çift a = 2.0 olarak ayarlarsak ve bellekte zaten 2.00001 veya 1.9999999 olarak hatırlanırsa, o zaman NormalizeDouble()'nin o zaman yardımcı olmayacağı açıktır, çünkü zaten kesin olmayan bir değer döndürür!
Bir değişkenin değerini hatırlarken böyle bir hatanın neredeyse hiç olmadığını düşünüyorum. Ayrıca, 2.0 sayısının özellikle 1.9999999999999 olarak hatırlandığını düşünmüyorum, çünkü her karakter (rakam veya nokta) için belleğin bit dizisindeki belirli bir bit yanıtlanacaktır! Yani 2.0 sayısı güvenli bir şekilde 2.00000...00 olarak saklanır.

İşaretleri kendimiz tanımlamadığımız başka bir durum:

bir = 4.0;
b = 2.0;
c = a / b // - "bölme" işlemi işlemci veya daha doğrusu yardımcı işlemci tarafından gerçekleştirilir ve ayrıca değişkeni karakterlerle (sayılar) doldurur.

Ameliyattan sonra şunlara sahip olabilirsiniz:
Sıklıkla:
c = 2.000...0
c= 1.999999999...
c= 2000000001...

onlar. sonuç genellikle gerçek olandan az miktarda farklılık gösterir.

Büyük hatalar çok nadirdir:
c = 2.3

Burada iki açıklama var:
1) a veya b çağrıldığında bit dizisinin bir kısmı bellekte hasar gördü, yani. a ve b değişkenleri değişti.
2) "bölme" işlemi sırasında bir hata oluştu.

Sanırım en sık olan şey 2). Neden bilmiyorum. Bunun, yardımcı işlemcinin çalışmasını ihtiyacın zararına olacak şekilde optimize etmeye çalıştıklarından kaynaklandığını düşünüyorum.

2.000...00 sayısı ile c değişkeni karşılaştırıldığında eşitliğin sağlanmayacağı açıktır. Çünkü tüm bitler eşleşmeyecektir.

Şimdi, NormalizeDouble() yardım etmek için burada!
NormalizeDouble() bu küçük hatayı "düzeltecek"!
Hata genellikle çok küçük olduğundan, küçük bir kesinlikle yuvarlama her zaman doğru sonucu verecektir.

Bunun gibi görünecek:
a = 2.111...11 sayısını ikinci ondalık basamağa yuvarlayalım.
Bunu yapmak için, NormalizeDouble() önce yeni değişkene 2.11 yazar ve kalan bitleri birler değil sıfırlarla doldurur!
Sanırım şöyle görünecek:

double MyNormalizeDouble(double value, int digits)
{
     int factor = MathRound( MathPow(10, digits) ); // factor - это множитель,
                                                       с помощью которого мы из VALUE сделаем целое число
     double result = MathRound(factor * value) / factor;
     return(result);
}
Burada, neden NormalizeDouble() gerekli olduğunu elimden geldiğince açıklamaya çalıştım.

Yakın zamana kadar bu açıklama bana tamamen uyuyordu. Ancak son zamanlarda kendim böyle bir planın her zaman işe yaramayacağına ikna oldum.

NormalizeDouble(a, 2) !OC! NormalizeDouble(b, 2), burada !OC! karşılaştırma operatörüdür.
Her ne kadar bence her zaman işe yaramalı!
Bu nedenle, makul ve anlaşılır herhangi bir eleştiriden memnuniyet duyacağım!
 
gravity001 :
SK. (a) yazdı:
...

Ve mevcut durumda, 123.000000000000 değişkeninin hesaplamalarda kullanıldığı zamandaki başlangıç değeri 122.999999999999 olabilir. Ve bu, değişkenin keşfedilmesinden bu yana değerinin hiç değişmemesine, ancak program tarafından yalnızca diğer hesaplamalara katılması istenmesine rağmen.

Aslında, tüm yaygara bu yüzden. Bu nedenle NormalizeDouble () işlevini gerçek hesaplamaya mümkün olduğunca yakın, tercihen if, for, while ifadesinin koşulunda kullanmak gerekli hale geldi.

Sözlerine güveniyor musun? Mümkünse bilginizin kaynağını belirtiniz?
Emin. Bilginin kaynağı, MQL4'te kendi programlama deneyimim ve geliştiricilerin danışmanlığıdır.
1? sorun bir değişkeni depolamak veya okumaksa, döndürülen değer de hatırlanırsa veya bir hatayla okunursa NormalizeDouble() nasıl yardımcı olabilir?
NormalizeDouble(), karşılaştırma işleminden hemen önce kullanılmalıdır. Karşılaştırma işleminin sonucu, hiçbir zaman bozulmayan boole türünde bir değerdir.
2? neden NormalizeDouble(değer, basamak) şeması !OC! NormalizeDouble(değer, rakamlar) burada !OS! - karşılaştırma operatörü, her zaman çalışmıyor mu? doğrudan if içine yerleştirilmiş olsa bile?
Bunu söylemedim. Bu tam olarak böyle çalışır ve böyle yapılmalıdır.
3? NormalizeDouble() (fonksiyon algoritması) nasıl çalıştığını biliyor musunuz?
Hayır bilmiyorum. Bununla geliştiricilere.
4? Bu konudaki fikrimi yazdım, siz ne düşünüyorsunuz?
Fikriniz ilginç, ancak bu sorun uzun zamandır çözüldü. Tekerleği yeniden icat etmemek ve geliştiricilerin tavsiyelerini kullanmak daha iyidir.
 
SK. писал (а):
yerçekimi001 :

2? neden NormalizeDouble(değer, basamak) şeması !OC! NormalizeDouble(değer, rakamlar) burada !OS! - karşılaştırma operatörü, her zaman çalışmıyor mu? doğrudan if içine yerleştirilmiş olsa bile?
Bunu söylemedim. Bu tam olarak böyle çalışır ve böyle yapılmalıdır.

İşte konuyla ilgili birkaç görüş daha

'Ve yine iki çift karşılaştırma hakkında' , ilk gönderiden 1 sayfa!

Tamsayı 24.12.2006 15:23

ne yazık ki NormalizeDouble(xy,Digits) yapısı NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) yapısıyla aynı değil

Renat 24.12.2006 16:15

Ve aynı olması gerekmez. Önce düzelt.

bence tasarım
if (NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) != 0)
Ve tasarım
if (NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
aynısı!

Sen ne diyorsun?
 
gravity001 :

Renat 24.12.2006 16:15

Ve aynı olması gerekmez. Önce düzelt.

bence tasarım
if ( NormalizeDouble (x,Digits) - NormalizeDouble(y,Digits) != 0)
Ve tasarım
if (NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
aynısı!

Sen ne diyorsun?


Peki ya Renat'ın görüşü..? ilgilenmiyorum??? MT geliştirme şirketinin genel müdürünün görüşüyle ilgilenmiyor musunuz?

Yoksa A.S.'deki o yaşlı kadın gibi misin? Puşkin mi? Sadece istiyorum, istiyorum, istiyorum! Peri masalının nasıl bittiğini hatırla. "Balık bir şey söylemedi. Kuyruğunu salladı ve masmavi denize yüzdü. Uzun süre denizde bir cevap bekledi. Beklemedi, yaşlı kadına döndü.."

 
SK. писал (а):
yerçekimi001 :


Renat 24.12.2006 16:15

Ve aynı olması gerekmez. Önce düzelt.

bence tasarım
if ( NormalizeDouble (x,Digits) - NormalizeDouble(y,Digits) != 0)
Ve tasarım
if (NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
aynısı!

Sen ne diyorsun?



Peki ya Renat'ın görüşü..? ilgilenmiyorum??? MT geliştirme şirketinin genel müdürünün görüşüyle ilgilenmiyor musunuz?


Yoksa A.S.'deki o yaşlı kadın gibi misin? Puşkin mi? Sadece istiyorum, istiyorum, istiyorum! Peri masalının nasıl bittiğini hatırla. "Balık bir şey söylemedi. Kuyruğunu salladı ve masmavi denize yüzdü. Uzun bir süre denizde cevap bekledi. Beklemedi, yaşlı kadına döndü.."



Yani Renat birinci seçeneğin doğru, ikinci seçeneğin yanlış olduğunu söyledi ve siz ikinci seçeneğin de doğru olduğunu söylediniz, değil mi?

2? neden NormalizeDouble(değer, basamak) şeması !OC! NormalizeDouble(değer, rakamlar) burada !OS! - karşılaştırma operatörü, her zaman çalışmıyor mu? doğrudan if içine yerleştirilmiş olsa bile?
Bunu söylemedim. Bu tam olarak böyle çalışır ve böyle yapılmalıdır.
 

Bunu daha fazla-daha az karşılaştırmasını ima ederek söyledim:

 if ( NormalizeDouble ( x , Digits ) > NormalizeDouble ( y , Digits ))

formun yapılarının her zaman işe yaramadığını akılda tutarak:

 double a = NormalizeDouble ( x , Digits ) ;
double b = NormalizeDouble ( y , Digits ) ;
 
if ( a > b )
  {
  ...
  }

onlar. NormalizeDouble (), karşılaştırma işleminin değerlendirildiği yere mümkün olduğunca yakın olarak doğrudan operatör başlığına eklenmelidir.

Geliştiricilerin görüşüne gelince, bu görüşe meydan okumak niyetinde değilim.

Ve sonra .. o iş parçacığında tamamen farklı bir tasarımla ilgiliydi:

 
SK. писал (а):

Bunu daha fazla-daha az karşılaştırmasını ima ederek söyledim:

 if ( NormalizeDouble ( x , Digits ) > NormalizeDouble ( y , Digits ))
Bu yapıyı aşağı yukarı kontrol etmedim ama eşitliği kontrol ettim.
Bu yapıyı kullandığımda karşılaştırma hataları yaşadım:

 if ( NormalizeDouble ( x , digits ) == NormalizeDouble ( y , digits ))
{
    ...
}
Neden bilmiyorsun?