Thread overview
Integer Overflow Kontrolü
Jul 28, 2022
dunecourser
Jul 28, 2022
dunecourser
Jul 28, 2022
Salih Dincer
Jul 28, 2022
Salih Dincer
Jul 29, 2022
Ali Çehreli
Jul 30, 2022
Salih Dincer
Jul 29, 2022
Ali Çehreli
July 28, 2022
Birçok dilde olduğu gibi D'de overflow kontrol edilmiyor.

Örneğin bu kod hata vermeyecektir:

-----
int x = int.max + 1;
int y = x;
-----

Bildiğim çözümler:

1. core.checkedint modülü:

Modülü baştan sona inceledim. Fonksiyonlar anlaması kolay olduğu kadar o kadar basit ki pragma(inline) yerleştirilmiş. Yani, bu öğretici de demek.

2. Bir takım kurallar öğrenmek, örneğin:

- eğer iki pozitif sayının toplamı negatif sayıysa sonuç overflowed durumdadır,
- eğer iki negatif sayının toplamı pozitif sayıysa sonuç overflowed durumdadır,
- aksi hâlde iki sayının toplamı overflowed durumda değildir.

Kodumdaki if blokları bu kuralları uyguluyor.

-----
int sumSequence(in int b, in int e)
    in (b < e, "Begin value is bigger than end value.")
{
    int result = 0;

    int current = b;
    for (; current < e; current += 1)
    {
        if (0 < result && 0 < current && 0 > result + current)
        {
            assert(false,
	    "Integer overflow: sum of two positive numbers yield a negative result.");
        }
        else if (0 > result && 0 > current && 0 < result + current)
        {
            assert(false,
	    "Integer overflow: sum of two negative numbers yield a positive result.");
        }

        result = result + current;
    }

    return result;
}
-----

Bana kalırsa bir sistem programlama dili olarak D'nin böylesine asla istemeyeceğiniz bir durum için compiler/run-time hatası vermemesi büyük bir problem; derleyici flag'leri ile açılıp kapatılabilirdi. D'nin hata mesajları genel olarak iyi olsa da bu konuyu tartışmamız gerekiyor diye düşünüyorum, çok eksik var aynı zamanda.

Siz overflow'ları kontrol etmek için nasıl bir yöntem izliyorsunuz, D'nin bu durumlardan kaçınmak için başka nasıl yöntemleri var, derleyiciyle etkileşime geçebilir miyiz?
July 28, 2022
On Thursday, 28 July 2022 at 04:27:19 UTC, dunecourser wrote:
>
>
On Thursday, 28 July 2022 at 04:27:19 UTC, dunecourser wrote:
Underflow vb. terimler de var elbette, basitleştirmek için sadece overflow kullandım.
July 28, 2022

On Thursday, 28 July 2022 at 04:30:33 UTC, dunecourser wrote:

>

On Thursday, 28 July 2022 at 04:27:19 UTC, dunecourser wrote:

>

On Thursday, 28 July 2022 at 04:27:19 UTC, dunecourser wrote:
Underflow vb. terimler de var elbette, basitleştirmek için sadece overflow kullandım.

Underflow nedir, ben bilmiyorum? Ama aritmetik işlemler neticesinde meydana gelen taşmalar (overflow) için ilgili konunun sayfasında şöyle bir dış kaynak verilmiş:

How Should You Write a Fast Integer Overflow Check?

Öte taraftan core.checkedint olanaklarını şu şekilde kullanabiliyoruz:

// İşaretsiz için:

import core.checkedint;

void main(){
  bool overflow;
  for (uint i = 0; i < 10; ++i)
  {
    bool overflow;
    immutable uint r = addu (uint.max - i, uint.max - i, overflow);
    assert (r == 2 * (uint.max - i));
    assert (overflow);
  }

// İşaretliler için:

  overflow = false;
  assert(adds(int.min + 1, -1, overflow) == int.min);
  assert(!overflow);

  assert(adds(int.max, 1, overflow) == int.min);
  assert(overflow);
}

Fakat bu işlemler biraz maliyetli olsa da modern derleyiciler bunları daha hızlı kod oluşturmada becerikli olabilirmiş.

Kolay gelsin...

July 28, 2022

On Thursday, 28 July 2022 at 13:03:32 UTC, Salih Dincer wrote:

>

Öte taraftan core.checkedint olanaklarını şu şekilde kullanabiliyoruz:

Standart kütüphanede de varmış ama maliyetli olduğu neticesini değiştirmiyor:

https://dlang.org/phobos/std_checkedint.html

Sevgiler, saygılarççç

July 28, 2022
On 7/27/22 21:27, dunecourser wrote:

> Modülü baştan sona inceledim. Fonksiyonlar anlaması kolay olduğu kadar o
> kadar basit ki pragma(inline) yerleştirilmiş. Yani, bu öğretici de demek.

Phobos'taki o basitlik, tam da benim bu seneki DConf konumun ana konusu. Bir dilin standart kütüphanesinin kullanıcılar tarafından okunabilir olması ve aynılarını yazılabilir olması bir üstünlük olarak kabul edilmeli.

> 2. Bir takım kurallar öğrenmek, örneğin:
>
> - eğer iki pozitif sayının toplamı negatif sayıysa sonuç overflowed
> durumdadır,
> - eğer iki negatif sayının toplamı pozitif sayıysa sonuç overflowed
> durumdadır,
> - aksi hâlde iki sayının toplamı overflowed durumda değildir.

Doğal olarak, onları ancak işaretli sayılarda uygulayabiliriz. İşaretsizlerin kötü tarafı, farkında olmadan bütün ifadeyi garipleştirmeleridir. "int terfileri" başlığında yazmışım:


http://ddili.org/ders/d/tur_donusumleri.html#ix_tur_donusumleri.terfi,%20tamsay%C4%B1

Uygulanabildiğinde, başka seçenekler de olabilir:

3. Sonucun hatalı olacağını baştan bilmek. Bu, programa göre farklı işleyecektir. Ama çarpmayı da karşılar.

4. Sonucu daha büyük bir türe yerleştirmek: Örneğin, 'int'ler için 'long' kullanılabilir.

> Bana kalırsa bir sistem programlama dili olarak D'nin böylesine asla
> istemeyeceğiniz bir durum için compiler/run-time hatası vermemesi büyük
> bir problem

Bu konunun nedenini tam hatırlamıyorum ama büyük olasılıkla masraf olmasın diyedir.

> derleyici flag'leri ile açılıp kapatılabilirdi.

Doğru. Walter Bright'ın bildiğim ilkelerinden birisi, programın davranışının derleyici flag'lerine bağlı olmamasıdır. Derlenebilmişse çalışmalıdır ve aynı sonucu üretmelidir.

> bu konuyu tartışmamız gerekiyor diye düşünüyorum

Bütün camiayı ilgilendirdiğinden bu konunun İngilizce forumlarda daha etkili olacağını düşünürüm. Ben kendimi bu konuda bilgili hissetmiyorum. (Doğrusu, pek deneyimli de değilim çünkü konu her ne kadar tehlikle gözükse de benim başıma geldiğini hatırlamıyorum.)

Ali

July 28, 2022
On 7/27/22 21:30, dunecourser wrote:
> On Thursday, 28 July 2022 at 04:27:19 UTC, dunecourser wrote:
>>
>>
> On Thursday, 28 July 2022 at 04:27:19 UTC, dunecourser wrote:
> Underflow vb. terimler de var elbette, basitleştirmek için sadece
> overflow kullandım.

Tabii ki. :) Üstelik ben eskiden alttan taşmayı (underlow) çıkarma işlemiyle ilgili sanıyordum, yalnızca kesirli sayılarla ilgili bir terimmiş:

Taşma (overflow):


http://ddili.org/ders/d/aritmetik_islemler.html#ix_aritmetik_islemler.ta%C5%9Fma

Alttan taşma (underflow):


http://ddili.org/ders/d/kesirli_sayilar.html#ix_kesirli_sayilar.alttan%20ta%C5%9Fma

Ali

July 30, 2022

On Friday, 29 July 2022 at 06:06:33 UTC, Ali Çehreli wrote:

>

Tabii ki. :) Üstelik ben eskiden alttan taşmayı (underlow) çıkarma işlemiyle ilgili sanıyordum, yalnızca kesirli sayılarla ilgili bir terimmiş:

Kesirli sayı dendiğinde benim aklıma pasta dilimleri geliyor. Her ne kadar mantis'ler (ondalıklı sayıyı oluşturan oranlar) bit'lerin içine gömülmüş kesirlerden oluşsa da bütüne baktığımızda (Türkçemizde virgül ile ayırdığımızdan) virgüllü sayılardan oluşuyor. Yani pay ve paydayı göremiyoruz hatta hayal bile edemeyeceğimiz karmaşık bir sistem.

Çok uzattım, özetle geniş bir aralık olan sayı sistemlerinden genelde ondalıklı ve tam sayıları kullanmaktayız. Elbette buna karmaşık sayıları veya sadece sayma sayıları (ubyte, ushort, uint, ulong) ile sınırlamak mümkün. Ama kesirli sayılar için struct Kesirli; şeklinde bir yapıya ihtiyacımız var ki bu kitapta mevcut.

Bir de şu sitede yer alan ve günlük hayatta parmaklarımızı bile kullanarak yaşamı kolaylaştıracak bir sistem var:

http://www.octomatics.org/

Sistem 8 (1 bayt) üzerine kurulu ve çok akıllıca geliştirilmiş! Normalde onluk sistemde, 10 parmağımız ile günün yarısını saat 10'a kadar sayabilirdiniz ve öğleye geldiğinizde başa dönüp 2 parmağınızı daha hareket ettirmelisiniz...

Bu sistemde sadece 8 parmağınızı kullanıyorsunuz ve kalan parmaklarınızı kuvveti olarak düşündüğünüzde bir günün tüm saatlerini sayabilirsiniz. Örneğin biz akşam 18'de (18 - 16 = 2) işten çıkıyoruz. Yani ellerimle biri kuvveti olmak üzere V - V şeklinde zafer işareti ile gösterebilirim.

Sevgiler, saygılar...