Problem, który widzę, polega na tym, że metaP skutecznie nadużywa wyliczenia zmiennych. Problem polega na tym, że wyliczenia są traktowane wewnętrznie jako liczby całkowite, co wyklucza próbę uzyskania z nich wartości zmiennoprzecinkowej. Możliwe jest jednak utworzenie własnego formatu zmiennoprzecinkowego, który tworzy dwa wyniki, część całkowitą i wykładnik. Nadal będziesz musiał przetworzyć to w float, jako Out = Sqrt<42>::mantissa * pow(10,Sqrt<42>::exponent);
. Właściwie to ustalenie wartości jest pozostawione ćwiczeniu dla czytelnika, ale prawdopodobnie będziesz musiał skalować wejście do góry (przez równomierną moc 10), obliczając root i przechowując opcję -power/2, której użyłeś wcześniej.
Aby obliczyć sqrt < 42>, należy najpierw ustawić wyliczenie wykładnika na odpowiednią moc, na przykład "-4" (im niższa, tym więcej miejsca po przecinku, ale uważaj na przepełnienie). Następnie pomnóż wejście przez '10^(- 2 * wykładnik) '. W tym przypadku otrzymasz 42 * 10^8 = 4200000000. Następnie pobierasz katalog główny tej wartości, uzyskując "64807" jako wartość końcową. W czasie wykonywania obliczysz "wartość * wykładnika 10" = "64807 * 10^-4" = 64807 * 0,0001 = 6,4807m i zachowasz wartość float.
Dodatkowa praca przeliczeniowa jest słabsza od celu, ale możesz ją nieco zmniejszyć, przechowując wykładnik jako 10^k (tj. 10^4), a następnie wykonując out=sqrt<x>::mantissa/sqrt<x>::exponent
.
edit Właśnie zauważyłem, że przy metodzie mantysa/wykładnik, wybór wykładnikiem jest dowolna tak długo, jak to jest większy niż część całkowitej ostatecznej korzenia. Może nawet być stałą, która ułatwia projektowanie twoich funkcji meta. W przypadku 42 na przykład można wybrać "wykładnik", aby zawsze był 6000. Następnie pomnożyć dane wejściowe przez 6000^2, wziąć całkowity katalog główny produktu, a następnie w czasie wykonywania podzielić wynik przez 6000, aby uzyskać katalog główny . Zamiast traktować wynik jako * 10^b, używa relacji sqr (x * b^2) = sqr (x) * b. Matematyka wyewidencjonuje:
- 42 * 6000 * 6000 = 1512000000
- sqr (1512000000) = 38884
- 38884/6000 = 6,4806 (do kwadratu jest 41,999)
google „szablonu METAPROGRAMOWANIE sqrt” i Znalazłem ten http://www.informit.com/articles/article.aspx?p=30667&seqNum=3 –
Widziałem już, ale to tylko dla integralnej części sqrt liczby całkowitej. Chciałbym mieć wynik zmiennoprzecinkowy podczas kompilacji. – Vincent
Ponieważ 'sqrt' jest standardową funkcją, użyłbym' sqrtt' zamiast tego. –