Jedną kwestią, o której nie widzę wyraźnie wspomnianego (chociaż nawiązuje do niego amon), jest to, że pierwiastek kwadratowy można traktować jako operację „pochodną”: jeśli implementacja tego nie zapewnia, możemy napisać własną.
Ponieważ pytanie jest oznaczone wzorem językowym, możemy rozważyć opis zależny od języka. Chociaż wiele języków ma różne filozofie, w paradygmatach bardzo często stosuje się enkapsulację, aby zachować niezmienniki; tzn. aby uniknąć posiadania wartości, która nie zachowuje się tak, jak sugerowałby jej typ.
Na przykład, jeśli mamy jakąś implementację liczb całkowitych używających słów maszynowych, prawdopodobnie chcemy jakoś zakapsułować reprezentację (np. Aby zapobiec zmianie bitów przez zmianę znaku), ale jednocześnie nadal potrzebujemy dostępu do tych bitów, aby zaimplementować operacje takie jak dodanie.
Niektóre języki mogą to zaimplementować za pomocą klas i metod prywatnych:
class Int {
public Int add(Int x) {
// Do something with the bits
}
private List<Boolean> getBits() {
// ...
}
}
Niektóre z systemami modułowymi:
signature INT = sig
type int
val add : int -> int -> int
end
structure Word : INT = struct
datatype int = (* ... *)
fun add x y = (* Do something with the bits *)
fun getBits x = (* ... *)
end
Niektóre z zakresem leksykalnym:
(defun getAdder ()
(let ((getBits (lambda (x) ; ...
(add (lambda (x y) ; Do something with the bits
'add))
I tak dalej. Jednak żaden z tych mechanizmów nie jest potrzebny do implementacji pierwiastka kwadratowego: można go zaimplementować za pomocą publicznego interfejsu typu liczbowego, a zatem nie potrzebuje dostępu do kapsułkowanych szczegółów implementacji.
Dlatego lokalizacja pierwiastka kwadratowego sprowadza się do filozofii / smaków języka i projektanta biblioteki. Niektórzy mogą wybrać, aby umieścić go „wewnątrz” wartości liczbowych (np sprawiają, że metody instancji), niektóre mogą wybrać, aby umieścić go na tym samym poziomie, co prymitywne operacji (może to oznaczać metodę instancji, czy może to oznaczać, żyjących poza wartości liczbowe, ale wewnątrz tego samego modułu / klasy / przestrzeni nazw, np. jako samodzielna funkcja lub metoda statyczna), niektórzy mogą zdecydować o umieszczeniu go w kolekcji funkcji „pomocniczych”, niektórzy mogą zdecydować o przekazaniu go do bibliotek stron trzecich.
1.sqrt()
ważny?