Числа с плавающей запятой, хранящиеся в компьютере, состоят из двух частей: целого и экспоненты, в которых база берется и умножается на целую часть.
Если компьютер работал в базе 10, 0.1
будет 1 x 10⁻¹
, 0.2
будет 2 x 10⁻¹
, а 0.3
будет 3 x 10⁻¹
. Целочисленная математика проста и точна, поэтому добавление 0.1 + 0.2
, очевидно, приведет к 0.3
.
Компьютеры обычно не работают в базе 10, они работают в базе 2. Вы все равно можете получить точные результаты для некоторые значения, например 0.5
, равны 1 x 2⁻¹
, а 0.25
- 1 x 2⁻²
, а их добавление приводит к 3 x 2⁻²
или 0.75
. Точно.
Проблема связана с числами, которые могут быть представлены точно в базе 10, но не в базе 2. Эти цифры должны округляться до их ближайшего эквивалента. Предполагая, что для 64-битного формата с плавающей точкой IEEE используется очень общий формат, ближайшим номером к 0.1
является 3602879701896397 x 2⁻⁵⁵
, а ближайшим номером к 0.2
является 7205759403792794 x 2⁻⁵⁵
; добавление их результатов в 10808639105689191 x 2⁻⁵⁵
или точное десятичное значение 0.3000000000000000444089209850062616169452667236328125
. Номера с плавающей запятой, как правило, округлены для отображения.
Это можно сделать. Настройка ... не очень проста, но конечный результат заключается в том, что вы можете искать всю сеть с python с несколькими строками кода.
Всего три основных шага.
На странице pygoogle указано:
К сожалению, Google больше не поддерживает API SOAP для поиск, а также не предоставляют новые лицензионные ключи. Вкратце, PyGoogle в настоящий момент почти мертв.
Вместо этого вы можете использовать их API AJAX. Взгляните сюда на пример кода: http://dcortesi.com/2008/05/28/google-ajax-search-api-example-python-code/
blockquote >... но вы также не можете использовать API AJAX. Вам нужно получить ключ API Google. https://developers.google.com/api-client-library/python/guide/aaa_apikeys Для простого экспериментального использования я предлагаю «серверный ключ».
2nd step: setup Custom Search Engine, чтобы вы могли искать всю сеть
. Действительно, старый API недоступен. Лучшим новым API, который доступен, является пользовательский поиск. Кажется, он поддерживает только поиск в определенных доменах, однако после следующих этот SO ответ вы можете выполнить поиск по всей сети:
blockquote>
- На главной странице Google Search Search ( http://www.google.com/cse/ ), нажмите «Создать систему пользовательского поиска».
- Введите имя и описание для вашей поисковой системы.
- В разделе «Определить свою поисковую систему» в поле «Сайты для поиска» введите хотя бы один действительный URL-адрес (на данный момент просто поместите www.anyurl.com, чтобы пройти мимо этого экрана. Подробнее об этом позже).
- Выберите версию CSE, которую вы хотите, и примите Условия использования, затем нажмите «Далее». Выберите желаемый вариант макета и нажмите «Далее».
- Нажмите любую из ссылок в разделе «Следующие шаги», чтобы перейти на панель управления.
- В левом меню, в разделе «Панель управления» нажмите «Основные».
- В разделе «Настройки поиска» выберите «Поиск по всему веб-сайту», но выделите включенные сайты.
- Нажмите «Сохранить изменения».
- В левое меню, в разделе «Панель управления», щелкните «Узлы».
- Удалите сайт, который вы ввели во время первоначальной установки.
Этот подход также рекомендуется Google: https://support.google.com/customsearch/answer/2631040
Третий шаг: установить клиент Google API для Python
pip install google-api-python-client
, более подробная информация здесь:
- repo: https://github.com/google/google-api-python-client
- еще info: https://developers.google.com/api-client-library/python/apis/customsearch/v1
- полные документы: https: // api -python-client-doc.appspot.com/
4-й шаг (бонус): выполните поиск
Итак, после настройки вы можете следовать образцам кода из нескольких мест:
- простой пример: https://github.com/google/google-api-python-client/blob/master/samples/customsearch/main.py
cse()
function docs: https://google-api-client-libraries.appspot.com/documentation/customsearch/v1/python/latest/customsearch_v1.cse.htmlи в итоге:
from googleapiclient.discovery import build import pprint my_api_key = "Google API key" my_cse_id = "Custom Search Engine ID" def google_search(search_term, api_key, cse_id, **kwargs): service = build("customsearch", "v1", developerKey=api_key) res = service.cse().list(q=search_term, cx=cse_id, **kwargs).execute() return res['items'] results = google_search( 'stackoverflow site:en.wikipedia.org', my_api_key, my_cse_id, num=10) for result in results: pprint.pprint(result)
После некоторой настройки вы можете написать некоторые функции, которые ведут себя точно так же, как ваш фрагмент, но я пропущу этот шаг здесь.