다음은 PHP 홈페이지의 매뉴얼에 있는 예제 그대로이다.

<?php
function fact($x) 
{
    $return = 1;
    for ($i=2; $i <= $x; $i++) {
        $return = gmp_mul($return, $i);
    }
    return $return;
}

echo gmp_strval(fact(1000)) . "\n";
?>

 

위의 내용을 test_gmp.php 라는 파일명으로 저장한 경우 php 명령으로 결과을 확인한다.

 

온라인에서 1000! 계산 결과 확인하기

 

Posted by Scripter
,

최근에 PHP 8 릴리즈가 발표되었다.

변한 것은 여러가지 있지만, 사소한 변화 한 가지만 소개한다.

PHP 8에서는 부동소수점수 나눗셈 함수 fdiv($a, $b) 가 추가되었다.

기존의 나눗셈 $a / $b 는 나누는 수 $b 가 0일 경우 에외가 발생하지만,

IEEE 754 의 권고에 따라 0으로 나누는 경우 나누어지는 수가

양수냐 움수냐 0이냐에 따라 나눈 결과가 각각 +INF, -INF, NAN 로 된다.

PHP 7,xx 까지에는 fmod($a, $b) 함수와 intdiv($a, $b) 함수가 이미 있었는데.

여기에 보조를 맞추어 fdiv($a, $b) 가 PHP 8에 새롭게 추가되었다고 한다.

intdiv() 와 대비되는 이름 floatdiv() 으=로 할까도 고려해보았지만,

fmod() 와 대비되는 이름 fdiv() 로 정했다고 한다.

다음은 인터프리터 명령 php -a 로 실행한 예이다.

Interactive shell

php > $a = 45.3;
php > $b = 11.2;
php > $c = fdiv($a, $b);
php > echo $c;
4.0446428571429
php > echo ($a . $b);
45.311.2
php > echo ($a / $b);
4.0446428571429
php > fdiv(11, 3);
php > echo fdiv(11, 3);
3.6666666666667
php > echo 11 / 3;
3.6666666666667
php > 11 / 0;

Warning: Uncaught DivisionByZeroError: Division by zero in php shell code:1
Stack trace:
#0 {main}
  thrown in php shell code on line 1
php > echo fdiv(11, 0);
INF
php > echo fdiv(-11, 0);
-INF
php > echo fdiv(-0, 0);
NAN
php > echo fdiv(0, 0);
NAN
php > echo fmod(-11, 0);
NAN
php > echo intdiv(-11, 3);
-3
php > echo -11/ 3;
-3.6666666666667
php > echo fmod(-11, 3);
-2
php > echo fdiv(-11 - fmod(-11, 3), 3);
-3
php > echo fdiv(22 - fmod(22, 3), 3);
7
php > echo fdiv(10, 0);
INF
php > echo fdiv(-1.2, 0);
-INF
php > echo fdiv(-0, 0);
NAN
php > echo (fdiv(12 - 5, 1 - 1) == INF);
1
php > echo (fdiv(-12 + 5, 1 - 1) == INF);
php > echo (fdiv(-12 + 5, 1 - 1) == INF);
php > echo (fdiv(-12 + 5, 1 - 1) == -INF);
1
php > echo (fdiv(-5 + 5, 1 - 1) == -INF);
php > echo (fdiv(-5 + 5, 1 - 1) == INF);
php > echo (fdiv(-5 + 5, 1 - 1) == NAN);
php > echo (fdiv(0, 0) == NAN);
php > echo (is_nan(fdiv(0, 0)));
1
php > echo (is_nan(fdiv(1, 0)));
php > echo (is_infinite(fdiv(1, 0)));
1
php > echo (is_finite(fdiv(1, 0)));
php > echo (is_finite(fdiv(1, 2)));
1
php > echo (is_infinite(fdiv(-1, 0)));
1
php > echo (is_finite(fdiv(-1, 0)));

   

관련 자료:

[1] PHP 홈페이지

[2] PHP8 다운로드

[3] PHP7과 PHP8의 간단 비교

[4] PHP8의 새 기능 몇 가지

 

 

 

 

Posted by Scripter
,

wx,html 모듈을 이용하는 첫째 소스는 http 프로토콜만 지원하고 https 프로토콜은 지원하지 않습니다.

그러나,  wx,html2 모듈을 이용하는 둘째 소스는 http 프로토콜과 https 프로토콜 모두를 지원합니다.

셋째 소스는 둘째 소스에 네비게이터(뒤로 가기, 앞으로 가기) 가능을 추가한 소스입니다.

[1] wx.html 모듈을 이용한 소스: simple_html_browser.py

# -*- coding: utf-8 -*-
#!/usr/bin/env python

# Filename: simple_html_browser.py
# Execute: python simple_html_browser.py
#    or
# Execute: ./simple_html.browser.py

import wx
import wx.html

class MyHtmlDialog(wx.Dialog):
    def __init__(self, parent, title):
        wx.Dialog.__init__(self, parent, -1, title, size=(600,400))
        html = wx.html.HtmlWindow(self)
        if "gtk2" in wx.PlatformInfo:
            html.SetStandardFonts()

        wx.CallAfter(html.LoadPage, "http://www.google.com")

if __name__ == "__main__":
    app = wx.App()
    dlg = MyHtmlDialog(None, "Simple HTML Browser")
    dlg.ShowModal()
    dlg.Destroy()
    app.MainLoop()

 

[2] wx.html2 모듈을 이용한 소스: simple_html2_browser.py

# -*- coding: utf-8 -*-
#!/usr/bin/env python

# Filename: simple_html2_browser.py
# Execute: python simple_html2_browser.py
#    or
# Execute: ./simple_html2_browser.py

import wx
import wx.html2

class MyHtml2Dialog(wx.Dialog):
    def __init__(self, parent, title):
        wx.Dialog.__init__(self, parent, -1, title, size=(600,400))
        html = wx.html2.WebView.New(self)
        if "gtk2" in wx.PlatformInfo:
            html.SetStandardFonts()

        wx.CallAfter(html.LoadURL, "https://www.google.com")

if __name__ == "__main__":
    app = wx.App()
    dlg = MyHtml2Dialog(None, "Simple HTML2 Browser")
    dlg.ShowModal()
    dlg.Destroy()
    app.MainLoop()

 

 

[3] 위의 둘째 것을 쓸 만 한하게 수정한 웹 브라우저 소스: simple_browser_wk.py

# -*- coding: utf-8 -*-
#!/usr/bin/env python

# Filename: simple_browser_wk.py
#
# Execute: python3 simple_browser_wk.py
#    or
# Execute: pythonw simple_browser_wk.py
#    or
# Execute: ./simple_browser_wk.py
#
# Date: 2020.11.29   Version 0.0.4

import wx 
import wx.html2 

class MyBrowser(wx.Frame): 
    def __init__(self, parent, title): 
        super(MyBrowser, self).__init__(parent, title = title,size = (800,400))  
        sizer = wx.BoxSizer(wx.VERTICAL) 

        hsizer = wx.BoxSizer(wx.HORIZONTAL) 
        emptyText = wx.StaticText(self, -1 , "     ", (10, 10), (10, -1))
        emptyText.SetBackgroundColour('#DDDDDD')
        self.addrText = wx.TextCtrl(self, wx.ID_ANY, value="", size=(300, 30))
        self.addrText.SetFont( wx.Font(12, wx.ROMAN, wx.NORMAL, wx.NORMAL)  )
        self.addrText.SetBackgroundColour('white')
        self.addrText.Bind(wx.EVT_CHAR, self.OnCharEvent)
        self.prevButton = wx.Button(self, 1, '<', (10, 10), (20, -1))
        self.prevButton.Bind(wx.EVT_BUTTON, self.OnPrevButton, id=1)
        self.nextButton = wx.Button(self, 1, '>', (10, 10), (20, -1))
        self.nextButton.Bind(wx.EVT_BUTTON, self.OnNextButton, id=1)
        self.homeButton = wx.Button(self, 1, 'Home', (10, 10), (80, -1))
        self.homeButton.Bind(wx.EVT_BUTTON, self.OnHomeButton, id=1)
        self.exitButton = wx.Button(self, 1, 'Exit', (10, 10), (80, -1))
        self.exitButton.Bind(wx.EVT_BUTTON, self.OnCloseButton, id=1)

        hsizer.Add(self.exitButton, 3, wx.EXPAND, 10) 
        hsizer.Add(self.homeButton, 3, wx.EXPAND, 10) 
        hsizer.Add(self.prevButton, 1, wx.EXPAND, 10) 
        hsizer.Add(self.nextButton, 1, wx.EXPAND, 10) 
        hsizer.Add(self.addrText, 30, wx.EXPAND, 10) 
        hsizer.Add(emptyText, 1, wx.EXPAND, 10) 
        sizer.Add(hsizer, 1, wx.EXPAND, 10) 
        self.browser = wx.html2.WebView.New(self) 
        sizer.Add(self.browser, 20, wx.EXPAND, 10) 
        self.SetSizer(sizer) 
        self.SetSize((800, 700)) 
        self.Bind(wx.html2.EVT_WEBVIEW_NAVIGATED, self.OnNavigated)
        self.OpenWebPage("https://www.google.com")

    def OnCharEvent(self, event):
        keycode = event.GetKeyCode()
        controlDown = event.CmdDown()
        altDown = event.AltDown()
        shiftDown = event.ShiftDown()

        if (not shiftDown) and (not altDown) and (not controlDown) and keycode == 13 :      # [Enter] key
            self.OpenWebPage(self.addrText.GetValue())

    def OnCloseButton(self, event):
        self.Destroy()
        quit()

    def OnHomeButton(self, event):
        self.OpenWebPage("https://scripting.tistory.com")
        event.Skip()

    def OnPrevButton(self, event):
         if self.browser.CanGoBack():
             self.browser.GoBack()
         event.Skip()

    def OnNextButton(self, event):
         if self.browser.CanGoForward():
             self.browser.GoForward()
         event.Skip()

    def OnNavigated(self, event): 
        self.addrText.SetLabel(self.browser.CurrentURL)
        # print(self.browser.CurrentTitle)
        self.SetTitle("SimpleBrowser - {0}".format(self.browser.CurrentTitle))
        event.Skip()

    def OpenWebPage(self, addr): 
        self.browser.LoadURL(addr)
        self.SetTitle("Simpl Browser")
        self.addrText.SetLabel(addr)
        self.Show() 


if __name__ == "__main__":	
    ex = wx.App() 
    f = MyBrowser(None,'Simple Btowser') 
    f.Show()
    ex.MainLoop()
    

 

 

 

 

 

Posted by Scripter
,