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

 
SK. писал (а):

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 )
  {
  ...
  }
Ve bence sonuç açısından birinci ve ikinci AYNI .
a ve b değişkenlerine atanan sonuçlar normalleştirilir ve daha sonra karşılaştırılabilir, onlara hiçbir şey olmaz.
Renat başka bir şey hakkında yazdı, çünkü bu örnekte normalleştirilmiş değerlerin çıkarılmasının sonucu normalize edilmemişti .
İşlemin nihai sonucunu normalleştirirseniz, onu bir değişkene atayabilir ve üzerinde işlem yapabilirsiniz. Ana şey, değişkenin kendisinin gelecekte değerini değiştirmemesidir.
 
gravity001 :
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?

Hangi hatalar?
 
Simca :
Ve bence sonuç açısından birinci ve ikinci AYNI .

Bazı durumlarda gerçekten işe yarıyor ama her zaman değil. Bu "her zaman değil", değerleri bilgisayarın belleğinde saklamanın kendine özgü yolları tarafından belirlenir. İşin aslı.

a ve b değişkenlerine atanan sonuçlar normalleştirilir ve daha sonra karşılaştırılabilir, onlara hiçbir şey olmaz.
Bu imkansız . Onlar. her şeyi yapabilirsiniz, ancak garantili bir sonuç elde etmek için, karşılaştırma operatörünü içeren ifadede doğrudan NormalizeDouble () kullanmalısınız.

Renat başka bir şey hakkında yazdı, çünkü bu örnekte normalleştirilmiş değerlerin çıkarılmasının sonucu normalize edilmemişti .
Evet. Ancak bu, önceki açıklamalarınızın doğru olduğu anlamına gelmez.

İşlemin nihai sonucunu normalleştirirseniz, onu bir değişkene atayabilir ve üzerinde işlem yapabilirsiniz. Ana şey, değişkenin kendisinin gelecekte değerini değiştirmemesidir.
Kullanılan özel bilgisayar teknolojisi nedeniyle son basamaktaki değeri değiştirebilir. Bu, kullanıcı fark etmeden gerçekleşebilir ve gerçekleşir. İşin aslı. Bazı durumlarda (örneğin, programın hata ayıklaması sırasında) çalışacak ve bu programı kullanırken, genellikle şanssız bir programcı tarafından beklendiği gibi çalışacak ve bazen çalışmayacaktır.

 

Her yeni kullanıcıya aynı şeyi 1000 defa açıklamak zorunda kalan geliştiricilere en içten taziyelerimi sunarım..

 
SK. писал (а):
yerçekimi001 :
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?

Hangi hatalar?
Koşul karşılanmadı, yani. denkleştirmiyor mu?
Ve yine de, neden hatanın bellekten çift değişkenleri depolamakta veya okumakta olduğunu düşünüyorsunuz? Aritmetik işlemlerde bir hata olabilir mi?

Bu durumda bir hata olabileceğini düşünüyor musunuz:

double a = 4.0;
double b = 2.0;

double c = a / b; // думаете, здесь в опрерации "деления" не может быть ошибки
                     (т.е. появление цифр отличных от нуля после точки)?
 
gravity001 писал (а):
На больше или меньше я не проверял эту конструкцию, а вот на равенство проверял.
У меня были ошибки при сравнении, когда я использовал такую конструкцию:

if ( NormalizeDouble ( x , digits ) == NormalizeDouble ( y , digits ))
{
    ...
}
Почему, не знаете?

Lütfen bana bu hatayı göster!
 
gravity001 :
Koşul karşılanmadı, yani. denkleştirmiyor mu?
Ve yine de, neden hatanın bellekten çift değişkenleri depolamakta veya okumakta olduğunu düşünüyorsunuz? Aritmetik işlemlerde bir hata olabilir mi?

Bu durumda bir hata olabileceğini düşünüyor musunuz:

double a = 4.0;
double b = 2.0;

double c = a / b; // думаете, здесь в опрерации "деления" не может быть ошибки
                     (т.е. появление цифр отличных от нуля после точки)?

Bölme işleminin kendisinin doğru yapıldığını düşünüyorum.

Tartışılan konu, bir değişkenin değerini elde etme yöntemiyle (hesaplamalar sonucu elde edilen değer veya değişkenin başlatılması sonucu elde edilen değer olup olmadığı) değil, programın yürütülmesi sırasında bu değişkenin değerinin kaderi ile ilgilidir. ve hatta sadece bilgisayarın çalışması. Ve kaderi tahmin edilemez. Bu nedenle, mantıksal işlemleri programlarken, kırmızı şerit işlevi NormalizeDouble () kullanılmalıdır.

Uygula iyidir. Doğru kullanım çok iyidir.

Uygulamayın - kötü. Yanlış kullanım kötüdür.

---

tatile gitmek istiyorum..

 
SK. писал (а):
Bazı durumlarda gerçekten işe yarıyor ama her zaman değil. Bu "her zaman değil", değerleri bilgisayarın belleğinde saklamanın kendine özgü yolları tarafından belirlenir. İşin aslı.
Değerleri bilgisayar belleğinde saklamanın yollarını biliyorum. :) Programlama deneyimi yaklaşık 20 yıldır. Hatta geçmişte üniversitedeki öğrencilere programlama öğrettim.

a ve b değişkenlerine atanan sonuçlar normalleştirilir ve daha sonra karşılaştırılabilir, onlara hiçbir şey olmaz.
Bu imkansız . Onlar. her şeyi yapabilirsiniz, ancak garantili bir sonuç elde etmek için, karşılaştırma operatörünü içeren ifadede doğrudan NormalizeDouble () kullanmalısınız.

Doğal olarak, bir ifadenin sonucunu herhangi bir şeyle karşılaştırmadan önce, bu sonucun normalleştirilmesi gerekir! Bununla kim tartışıyor?! Ama bunun bizim tartışmamızla ilgisi yok. Kod kimliğinden bahsediyordum. Ve içindeki bütün fark, ikinci durumda normalleştirme sonuçlarının değişkenlerde saklanmasıdır. VE HERŞEY!

Onlar. NormalizeDouble işlevinin iki katından daha büyük bir bit genişliğine sahip bir sonuca sahip olduğunu iddia ediyorsunuz (işlevin sonucu en az bir bit olmak üzere daha fazla bellek biti kaplıyor). Sadece bunun için fonksiyonun sonucunu bir değişkene kaydederken herhangi bir kaybı (veya değişikliği) açıklayabilirim. Veya, atama sırasında, verilerin bir bellek hücresinden diğerine bayt bayt çoğaltılması değil, bazı zor işlemler gerçekleştirilir ???

Bir kez daha söylüyorum, karşılaştırma işleminin sağ ve sol işlenenlerinin ayrı normalleştirmelerinin doğruluğunu veya başka bir şeyi tartışmıyorum. Soru, yalnızca yukarıdaki iki kod parçasının sonuçlarının kimliği ile ilgilidir.

İşlemin nihai sonucunu normalleştirirseniz, onu bir değişkene atayabilir ve üzerinde işlem yapabilirsiniz. Ana şey, değişkenin kendisinin gelecekte değerini değiştirmemesidir.
Kullanılan özel bilgisayar teknolojisi nedeniyle son basamaktaki değeri değiştirebilir. Bu, kullanıcı fark etmeden gerçekleşebilir ve gerçekleşir. İşin aslı. Bazı durumlarda (örneğin, programın hata ayıklaması sırasında) çalışacak ve bu programı kullanırken, genellikle şanssız bir programcı tarafından beklendiği gibi çalışacak ve bazen çalışmayacaktır.

VAY! Ve ne tür "belirli bilgisayar teknolojileri" demek istiyorsunuz? Kullanıcı için, genel olarak, pek çok şey "belirsiz bir şekilde gerçekleşir", ancak sonuçta biz programcıyız . :) Bizim için hiçbir şey anlaşılmaz bir şekilde olmamalı , aksi takdirde artık bir bilgisayar değil, öngörülemeyen bir sonucun üreticisi olacak. :) Yoksa zaten bilgisayarlarımızda gezinen bitler mi var? Bazen öyle okurlar, bazen öyle okurlar... Bir kez daha! Gerçek sayılarla aritmetik işlemler yapıldığında, sonuç gerçekten kesinlikle doğru değildir (gerçek sayıların temsil edilme şeklinden dolayı). Ancak bu atama işlemleri için geçerli değildir. NormalizeDouble işlevi tamamlandıktan ve double türünde bir sonuç döndürdükten sonra, bu sonuç, değeri kopyalayarak bir değişkene yerleştirilir (tüm baytlar eşleşir). Gelecekte, değişkenin değeri değişmezken (yani sadece okunur, ancak ona hiçbir şey yazılmaz), orijinal biçiminde saklanır ve hiçbir kategoride hiçbir işaret yüzmez. Okusanız bile aynı şeyi anlayacaksınız. Ancak en azından 1 ile çarpmak ve sonucu geri yazmak yeterlidir - burada hiçbir şey garanti edilmez.

 
SK. писал (а):

Her yeni kullanıcıya aynı şeyi 1000 defa açıklamak zorunda kalan geliştiricilere en içten taziyelerimi sunarım..

Bu zaten açık bir çarpışma - belki de görmezden geleceğim . :)
 
gravity001 :

Bu durumda bir hata olabileceğini düşünüyor musunuz:

double a = 4.0;
double b = 2.0;

double c = a / b; // думаете, здесь в опрерации "деления" не может быть ошибки
                     (т.е. появление цифр отличных от нуля после точки)?

Bu durumda işlemin sonucu YAKLAŞIK 2,0 olacaktır.
Çok uzak rakamlardaki bir hata, gerçek sayıların temsil edilme biçiminden kaynaklanabilir.
Neden: